每日一題 重建二叉樹

2021-09-26 09:12:52 字數 4466 閱讀 9533

題目:輸入某二叉樹的先序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的先序遍歷和中序遍歷的結果中都不含重複的數字。例如:前序遍歷序列{ 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 ...

每日演算法 重建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。核心思路 二叉樹的前序遍歷順序是 根節點 左子樹 右子樹,每個子樹的遍歷順序同樣滿足前序遍歷順序。二叉樹的中序遍歷順序是 左子樹 根...