根據先序遍歷和中續遍歷重構二叉樹

2021-08-04 11:23:45 字數 1635 閱讀 7861

今天在牛客網上遇到這樣一道題,題目內容如下:

題目描述:

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。

題目的意思是根據一棵二叉樹的先序和後續序列重構二叉樹。

階梯思路是:

(1)首先先序中的第乙個元素一定是二叉樹的根節點。根據這個根節點找到在中序中的位置,那麼這一位置左邊的元素全部是二叉樹的左孩子,這一節點的所有右邊節點全部是二叉樹的右孩子。

(2)其次構造右子樹和左子樹。構造思路是:從先序和中序中找到左子樹和右子樹的先序和中序序列,然後遞迴構造,直至所有節點使用完。即得到重構的二叉樹。

//節點的資料結構

class treenode

}public class main

//在中序中找到根節點所在的位置,中序中該位置左邊的為左子樹,右邊的為右子樹

int i = 0;

while(pre[0] != in[i])

//建立一棵樹

treenode root = new treenode(pre[0]);

//左子樹中序為

int inlefttree = new int[i];

for(int k = 0; k < i ; k++)

//右子樹中序為

int inrighttree = new int[in.length - i -1];

for(int k = i + 1; k < in.length; k++)

//左子樹的先序為

int preleft = new int[i];

for(int k = 0; k < i; k++)

//右子樹的先序為

int preright = new int[pre.length - i - 1];

for(int k = i + 1; k < pre.length; k++)

//遞迴構造左右子樹

root.left = reconstructbinarytree(preleft, inlefttree);

root.right = reconstructbinarytree(preright, inrighttree);

return root;

} public static void main(string args) ;

int b = ;

treenode root = reconstructbinarytree(a, b);

//後續遍歷二叉樹

lastlist(root);

} //後續遍歷這棵二叉樹 以驗證重構的是否正確

private static void lastlist(treenode root)

last(root.left);

last(root.right);

system.out.print(root.val + " "); }}

**連線:

這二叉樹的實際結構如下圖:

根據先序遍歷和中序遍歷建立二叉樹

先序遍歷的順序是根左右,中序遍歷的順序是左根右。根據這一特性,先序遍歷的第乙個元素肯定是根節點。所以我們只要在中序遍歷中找到該根節點的值,根節點以左就是它的左子樹,根節點以右就是它的右子樹,然後就可以遞迴的方式建立二叉樹 假設現在有一顆二叉樹如下 先序序列為 18,14,7,3,11,22,35,2...

二叉樹 根據先序和中序遍歷輸出後序遍歷

根據兩種遍歷順序確定樹結構 build tree 題目描述 輸入第1行 二叉樹的前序遍歷順序 第2行 中序遍歷順序 輸出 二叉樹的後序遍歷順序 樣例輸入 abcdefgh cbedaghf 樣例輸出 cedbhgfa 分析 這道題最核心的問題在於如何建樹 或模擬建樹 類似於分治 遞迴 我們設先序串為...

二叉樹遍歷(先序遍歷 中序遍歷 後續遍歷)

1 先序遍歷也叫做先根遍歷 前序遍歷,可記做根左右 二叉樹父結點向下先左後右 2 首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷左 右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹,如果二叉樹為空則返回。非遞迴遍歷 param b public static void prescan...