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的所在子樹...