題目如下:
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。
分析:
二叉樹的前序遍歷順序是:先訪問根節點,然後前序遍歷左子樹,再前序遍歷右子樹。
中序遍歷順序是:中序遍歷根節點的左子樹,然後是訪問根節點,最後中序遍歷右子樹。
1、二叉樹的前序遍歷序列一定是該樹的根節點
2、中序遍歷序列中根節點前面一定是該樹的左子樹,後面是該樹的右子樹
從上面可知,題目中前序遍歷的第乙個節點一定是這棵二叉樹的根節點,根據中序遍歷序列,可以發現中序遍歷序列中節點之前的是這棵二叉樹的左子樹,是這棵二叉樹的右子樹。然後,對於左子樹,遞迴地把前序子串行和中序子串行看成新的前序遍歷和中序遍歷序列。此時,對於這兩個序列,該子樹的根節點是,該子樹的左子樹為、右子樹為空,如此遞迴下去(即把當前子樹當做樹,又根據上述步驟分析)。這棵右子樹的分析也是這樣。
**如下:
class treenode
}public class testrecoverbinarytree
return btconstruct( preorder, inorder, 0, plen-1,0, ilen-1);
}//構建方法,pstart和pend分別是前序遍歷序列陣列的第乙個元素和最後乙個元素;
//istart和iend分別是中序遍歷序列陣列的第乙個元素和最後乙個元素。
public treenode btconstruct(int preorder, int inorder, int pstart, int pend,int istart,int iend)
int root = 0;
//找中序遍歷中的根節點
for(root=istart; root0)
//遍歷右子樹
if(rightlength>0)
return tree;
}}
注意:
已知前序和中序遍歷,可以確定一棵二叉樹。已知中序和後序遍歷,可以確定一棵二叉樹。但是,已知前序和後序遍歷,不能確定一棵二叉樹。
已知前序和中序遍歷,重建二叉樹
想在牛客網上寫此題目,此處 題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。分析 前序遍歷 根節點 左子樹 右子樹 中序遍歷 左子樹 根節點 右子樹 後序遍歷 左子樹 右...
已知前序 中序 求二叉樹
題目如下 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。分析 二叉樹的前序遍歷順序是 先訪問根節點,然後前序遍歷左子樹,再前序遍歷右子樹。中序遍歷順序是 中序遍歷根節點的左子樹,...
6 3 3 二叉樹重建 已知前序和中序求後序
在一棵二叉樹總,前序遍歷結果為 dbacegf,中序遍歷結果為 abcdefg,求後序遍歷結果。我們知道 前序遍歷方式為 根節點 左子樹 右子樹 中序遍歷方式為 左子樹 根節點 右子樹 後序遍歷方式為 左子樹 右子樹 根節點 從這裡可以看出,前序遍歷的第乙個值就是根節點,然後再中序遍歷中找到這個值,...