題目:輸入某二叉樹的先序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的先序遍歷和中序遍歷的結果中都不含重複的數字。例如:前序遍歷序列{ 1, 2, 4, 7, 3, 5, 6, 8}和中序遍歷序列{4, 7, 2, 1, 5, 3, 8,6},重建出下圖所示的二叉樹並輸出它的頭結點。* @param preorder 先序遍歷
* @param postorder 中序遍歷
* @return 二叉樹的根結點
*/private
static binarytreenode construct
(int
preorder,
int[
] postorder)
return
construct
(preorder,
0, preorder.length -
1, postorder,
0, postorder.length -1)
;}/** *
* @param preorder 先序遍歷
* @param prestart 先序遍歷的開始位置
* @param preend 先序遍歷的結束位置
* @param postorder 中序遍歷
* @param poststart 中序遍歷的開始位置
* @param postend 中序遍歷的結束位置
* @return 樹的根結點
*/private
static binarytreenode construct
(int
preorder,
int prestart,
int preend,
int[
] postorder,
int poststart,
int postend)
// 取先序遍歷的第乙個數字,就是當前的根結點
int val = preorder[prestart]
;int index = poststart;
// 在中序遍歷的陣列中找根結點的位置
while
(index <= postend && postorder[index]
!= val)
// 如果在整個中序遍歷的陣列中沒有找到,說明輸入的引數是不合法的,丟擲異常
if(index > postend)
// 建立當前的根結點,並且為結點賦值
binarytreenode node =
newbinarytreenode()
; node.val = val;
// 遞迴構建當前根結點的左子樹,左子樹的元素個數:index-poststart個
// 左子樹對應的先序遍歷的位置在[prestart+1, prestart+index-poststart]
// 左子樹對應的中序遍歷的位置在[poststart, index-1]
node.left =
construct
(preorder, prestart +
1, prestart + index - poststart, postorder, poststart, index -1)
;// 遞迴構建當前根結點的右子樹,右子樹的元素個數:postend-index個
// 右子樹對應的前序遍歷的位置在[prestart+index-poststart+1, preend]
// 右子樹對應的中序遍歷的位置在[index+1, postend]
node.right =
construct
(preorder, prestart + index - poststart +
1, preend, postorder, index +
1, postend)
;// 返回建立的根結點
return node;
}/**
* * 中序遍歷二叉樹
* @param root 根結點
*/private
static
void
printtree
(binarytreenode root)
}/**
* 普通二叉樹
* 1
* / \
* 2 3
* / / \
* 4 5 6
* \ /
* 7 8
*/private
static
void
test1()
;int
postorder =
; binarytreenode root =
construct
(preorder, postorder)
;printtree
(root);}
/** * 所有的結點都沒有右子樹
* 1
* /
* 2
* /
* 3
* /
* 4
* /
* 5
*/private
static
void
test2()
;int
postorder =
; binarytreenode root =
construct
(preorder, postorder)
;printtree
(root);}
/** * 所有的結點都沒有左子樹
* 1
* \
* 2
* \
* 3
* \
* 4
* \
* 5
*/private
static
void
test3()
;int
postorder =
; binarytreenode root =
construct
(preorder, postorder)
;printtree
(root);}
/** *
* 樹中只有乙個結點
*/private
static
void
test4()
;int
postorder =
; binarytreenode root =
construct
(preorder, postorder)
;printtree
(root);}
/** * 完全二叉樹
* 1
* / \
* 2 3
* / \ / \
* 4 5 6 7
*/private
static
void
test5()
;int
postorder =
; binarytreenode root =
construct
(preorder, postorder)
;printtree
(root);}
/** *
* 輸入空指標
*/private
static
void
test6()
/** *
* 輸入的兩個序列不匹配
*/private
static
void
test7()
;int
postorder =
; binarytreenode root =
construct
(preorder, postorder)
;printtree
(root);}
public
static
void
main
(string[
] args)
}執行結果:
每日一題 平衡二叉樹
題目描述 給定乙個二叉樹,判斷它是否是高度平衡的二叉樹。本題中,一棵高度平衡二叉樹定義為 乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1 示例1 輸入 root 3,9,20,null,null,15,7 輸出 true 示例2 輸入 root 1,2,2,3,3,null,null,...
每日演算法題 《重建二叉樹》
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。所以我們可以知道,前序遍歷第乙個是中,也就是頭結點 class treenode def init self,x self.val ...
每日演算法 重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。核心思路 二叉樹的前序遍歷順序是 根節點 左子樹 右子樹,每個子樹的遍歷順序同樣滿足前序遍歷順序。二叉樹的中序遍歷順序是 左子樹 根...