輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。
我們都知道,通過前序遍歷和中序遍歷或後序遍歷和中序遍歷可以唯一確定一棵二叉樹。
前序:根、左、右
中序:左、根、右
後序:左、右、根
可以看出,前序的第乙個元素是根節點,緊跟著的是左子樹序列和右子樹序列。而中序的根節點將左右子樹分割開來。
因此,就本題而言,可以先從前序序列中找第乙個元素,它一定是根節點。然後,在中序中找到該元素(根節點)所在位置,那麼該位置左右分別是左子樹的中序序列和右子樹的中序序列。
在前序序列中,根節點緊跟著左子樹、右子樹,根據前序左(右)子樹節點個數與中序左(右)子樹節點個數是一樣的,可以在前序序列中分別找到左子樹的前序序列和右子樹的前序序列。
這樣,就有了:
左子樹的中序序列—–左子樹的前序序列,右子樹的中序序列—–右子樹的前序序列,這兩對序列。
問題又變成了已知前、中序列,求構建子二叉樹的問題。很明顯,方法已經在上面定義好了,再次呼叫就好了,這就是用遞迴的方法逐層求解嘍。
/**
* definition for binary tree
* struct treenode
* };
*/class solution
vector
preleft,preright,inleft,inright;//分別記錄前序左字樹、前序右字樹,中序左子樹,中序右子樹
int rootvalue = pre[0];//前序的第乙個元素是根節點值
treenode * root = new treenode(rootvalue);//構建根節點
//在中序序列中找到根節點位置,用i記錄
int i = 0;
for(;iif(vin[i] == rootvalue)
}for(int j = 0;jif(j//左子樹
inleft.push_back(vin[j]);
preleft.push_back(pre[j+1]);
}else
if(j>i)
}root->left = reconstructbinarytree(preleft,inleft);
root->right = reconstructbinarytree(preright,inright);
return root;
}};
c++都能實現,其他語言自然不在話下~(≧▽≦)/~啦啦啦 劍指offer程式設計題 重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。這道題目是一道非常經典的題目,這裡可以用乙個hash表存下中序遍歷的value的index,可以快速找到index definiti...
劍指offer程式設計題 重建二叉樹
題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。方案 在二叉樹的前序遍歷序列中,第乙個數字總是樹的根節點的值 在二叉樹的中序遍歷序列中,根節點的值在序列的中間,根節點左側...
劍指Offer 程式設計題 重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。二叉樹 在電腦科學中,二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作 左子樹 left subtree 和 右子樹 righ...