今天在牛客網上遇到這樣一道題,題目內容如下:
題目描述:題目的意思是根據一棵二叉樹的先序和後續序列重構二叉樹。輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。
階梯思路是:
(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...