public
treenode
buildtree
(int
inorder
,int
postorder
)int
leftinorder
=arrays
.copyofrange
(inorder,0
,rootvalidx);
int[
]rightinorder
=arrays
.copyofrange
(inorder
,rootvalidx+1
,inorder
.length);
//根據分出的左右子樹,找到後序遍歷中左右臨界點
int[
]leftpostorder
=new
int;
int[
]rightpostorder
=new
int;
if(leftinorder
.length==
0)elseif(
rightinorder
.length==
0)else//
判斷當前節點下乙個節點是否在右子樹
boolean
rightflag
=false
;for
(intj=
0;i+
1<
postorder
.length&&
j<
rightinorder
.length&&
!rightflag;j
++)/
/當前在左子樹,下乙個在右子樹,把當前節點的下乙個作為分界點if(
leftflag&&
rightflag
)mididx=i
+1;}
//從後序遍歷序列中切出左右子樹
leftpostorder
=arrays
.copyofrange
(postorder,0
,mididx);
rightpostorder
=arrays
.copyofrange
(postorder
,mididx
,postorder
.length-1)
;}//
遞迴對左子樹的中序、後序序列構建
root
.left
=buildtree
(leftinorder
,leftpostorder);
//遞迴對右子樹的中序、後序序列構建
root
.right
=buildtree
(rightinorder
,rightpostorder);
return
root
;}
public
intsumnumbers
(treenode
root
)private
intsumnumbers
(treenode
root
,int
lastsum
)
public
static
list
<
integer
>
flipmatchvoyage
(treenode
root
,int
voyage)if
(idx
<
voyage
.length&&
node
.left!=
null&&
node
.left
.val!=
voyage
[idx])
else
}return
res;
}
list
<
integer
>
list
=new
arraylist
<
>()
;if(root==
null
)return
list;/
/記錄葉子節點的深度if(
root
.left==
null&&
root
.right==
null
)list
.add
(level);
//遞迴獲得左右子樹葉子節點深度
list
<
integer
>
left
=dfs
(root
.left
,level+1
,distance);
list
<
integer
>
right
=dfs
(root
.right
,level+1
,distance);
//判斷當前節點的左右子樹中復合條件的葉子節點對數
for(
intl:left)}
//左右子樹的葉子節點合併向上層傳遞
list
.addall
(left);
list
.addall
(right);
return
list
;
二叉樹 筆1
關於二叉樹中,對於前序 中序 後序三者中,知道知道兩個,求另外的乙個有什麼方法?比如題目 若某二叉樹的前序遍歷訪問順序是abdgcefh,中序遍歷訪問順序是dgbaechf,則其後序遍歷的結點訪問順序是 解答過程 1 定 釋 樹的遍歷的三種情況,是根據左子樹 右子樹 根這3者的不同訪問次序來定義的。...
leetcode 二叉樹 對稱二叉樹
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3 但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3 方法一 遞迴 思路 如果乙個樹的左子樹與右子樹映象對稱,則該樹是對稱的 兩個樹互為映象的...
LeetCode (二叉樹)反轉二叉樹
遞迴交換每乙個節點的左右子樹,重點在於訪問每乙個節點,然後交換左右子樹 definition for a binary tree node.struct treenode struct treenode inverttree struct treenode root 由於至少要講每乙個節點都訪問一次...