二叉樹的生成

2021-10-09 05:42:17 字數 2217 閱讀 9900

from pdd

給定乙個list,比如 [7, 8]、[2, 3]、[2, 4]、[4, 5]、[4, 6]、[3, 7],其中integer[0]表示父節點,integer[1]表示子節點(排在前面的為左子節點,排在後面的為有子節點)

題目要求:根據這個list生成一棵二叉樹,並按照前序遍歷輸出

根據如上描述,生成的二叉樹應該長這樣

2

/ \3 4

/ / \

7 5 6

/8

前序遍歷輸出的結果應該是

2 3 7 8 4 5 6

首先,先找出整棵樹的根節點,根節點的特點為:只能是父節點,不能是子節點,即根節點只能出現在陣列的左邊,不能出現在陣列的右邊

為了降低時間複雜度,封裝乙個hashmap>物件用於對原始資料進行封裝,key 為父節點的值,value 為子節點對應的 list

**

/**

* @classname binarytreedemo

* @description todo

* @author heygo

* @date 2020/8/16 10:28

* @version 1.0

*/public

class

binarytreedemo

,new

integer

,new

integer

,new

integer

,new

integer

,new

integer

);binarytree tree = binarytree.

generatetree

(origndata)

; tree.

preoder()

;}}// 二叉樹的定義

class

binarytree

else

}// 二叉樹

binarytree tree =

newbinarytree()

;// [7, 8]、[2, 3]、[2, 4]、[4, 5]、[4, 6]、[3, 7]

// 尋找根節點:左邊為父節點,右邊為子節點,根節點只會在左邊出現,不會在右邊出現

for(integer parent : parents)

}// 利用佇列層序生成二叉樹

queue

queue =

newlinkedlist()

;// 根節點先入隊

queue.

add(tree.treeroot)

;while

(queue.

isempty()

==false

)// 既有左子節點,又有右子節點

if(curchildren.

size()

>=2)

}}// 返回二叉樹

return tree;

}/**

* 二叉樹前序遍歷

*/public

void

preoder()

/** * 二叉樹前序遍歷

** @param treenode 當前正在遍歷的父節點

*/public

void

preoder

(treenode treenode)

// 否則輸出父節點

system.out.

print

(treenode +

" ")

;// 對其左節點進行前序遍歷

preoder

(treenode.left)

;// 對其右節點進行前序遍歷

preoder

(treenode.right);}

}// 二叉樹節點

class

treenode

@override

public string tostring()

}

程式執行結果

2 3 7 8 4 5 6

生成二叉樹

問題描述 由中序遍歷和後續遍歷生成二叉樹 解題思路 方法一 時間o n2 空間 o 1 public treenode buildtree int inorder,int postorder public treenode buildnode int inorder,int ib,int ie,in...

二叉樹的生成

先序 4 1 3 2 6 5 7 中序 1 2 3 4 5 6 7 後序 2 3 1 5 7 6 4 知道先序和中序求後序 源 include using namespace std const int maxn 50 5 int pre maxn mid maxn 前序 和 中序 struct n...

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...