天天看点

非二叉树转换成二叉树

package main

import (
	"unsafe"
	"fmt"
)

type TreeNode struct {
	x int
	childs []*TreeNode
}

type Tree TreeNode

type BTreeNode struct {
	x int
	lchild *BTreeNode
	rchild *BTreeNode
}

type BTree BTreeNode

func createTree() *Tree {
	node5:=&TreeNode{5,[]*TreeNode{}}
	node6:=&TreeNode{6,[]*TreeNode{}}
	node7:=&TreeNode{7,[]*TreeNode{}}
	node8:=&TreeNode{8,[]*TreeNode{}}
	node9:=&TreeNode{9,[]*TreeNode{}}
	node10:=&TreeNode{10,[]*TreeNode{}}
	node2:=&TreeNode{2,[]*TreeNode{node5,node6,node7}}
	node3:=&TreeNode{3,[]*TreeNode{node8}}
	node4:=&TreeNode{4,[]*TreeNode{node9,node10}}
	node1:=&TreeNode{1,[]*TreeNode{node2,node3,node4}}
	return (*Tree)(unsafe.Pointer(node1))
}

func convertToBTree(tree *Tree) *BTree {
	root:=(*TreeNode)(unsafe.Pointer(tree))
	rootb:=&BTreeNode{root.x,nil,nil}
	var childs []*BTreeNode
	for i:=0; i<len(root.childs); i++ {
		child:=root.childs[i]
		childTree:=(*Tree)(unsafe.Pointer(child))
		childBTree:=convertToBTree(childTree)
		childb:=(*BTreeNode)(unsafe.Pointer(childBTree))
		childs=append(childs,childb)
	}
	for i:=0; i<len(childs); i++ {
		if i==0 {
			rootb.lchild=childs[i]
		} else {
			childs[i-1].rchild=childs[i]
		}
	}
	return (*BTree)(unsafe.Pointer(rootb))
}

func pretravel(btree *BTree)  {
	root:=(*BTreeNode)(unsafe.Pointer(btree))
	fmt.Print(root.x," ")
	if root.lchild!=nil {
		pretravel((*BTree)(unsafe.Pointer(root.lchild)))
	}
	if root.rchild!=nil {
		pretravel((*BTree)(unsafe.Pointer(root.rchild)))
	}
}

func midtravel(btree *BTree)  {
	root:=(*BTreeNode)(unsafe.Pointer(btree))
	if root.lchild!=nil {
		midtravel((*BTree)(unsafe.Pointer(root.lchild)))
	}
	fmt.Print(root.x," ")
	if root.rchild!=nil {
		midtravel((*BTree)(unsafe.Pointer(root.rchild)))
	}
}

func lasttravel(btree *BTree)  {
	root:=(*BTreeNode)(unsafe.Pointer(btree))
	if root.lchild!=nil {
		lasttravel((*BTree)(unsafe.Pointer(root.lchild)))
	}
	if root.rchild!=nil {
		lasttravel((*BTree)(unsafe.Pointer(root.rchild)))
	}
	fmt.Print(root.x," ")
}

func main()  {
	tree:=createTree()
	treeb:=convertToBTree(tree)
	pretravel(treeb)
	fmt.Println()
	midtravel(treeb)
	fmt.Println()
	lasttravel(treeb)
}
           

继续阅读