標籤:二叉樹
二叉樹是我們學習資料結構階段一個重要的知識點,二叉樹又被分為滿二叉樹,完全二叉樹和其它三種來學習,所謂的滿二叉樹是指我們的二叉樹的每一個非葉子節點一定含有左孩子和右孩子,而完全二叉樹則是指我們的樹的葉子節點必須連續的分布在樹的左邊。
今天,我們來探索一下如何在知道二叉樹前序走訪順序及中序遍曆順序來重建二叉樹
首先,重建我們的二叉樹,必須要找到根節點,那麼根節點應該如何找到呢。如所示,根結點必定是我們前序走訪數組的首元素。在知道了根節點的情況下,我們就可以在我們的中序遍曆序列裡找到我們需要的根節點所在。只要有了根節點的位置,我們很容易就可以確定左樹節點個數,以及右樹的節點個數。而我們很清楚,在二叉樹這裡我們大多採用遞迴來解決子問題,所以顯而易見的,我們將根節點的左子樹和右子樹轉換成為子問題來解決更加容易理解。
650) this.width=650;" src="http://s4.51cto.com/wyfs02/M01/7F/B5/wKioL1cp4Ljgs5RrAAALCZNRp2Y032.png" title="捕獲12.PNG" alt="wKioL1cp4Ljgs5RrAAALCZNRp2Y032.png" />
下面我給出了本題的詳細代碼以及注釋650) this.width=650;" src="http://img.baidu.com/hi/jx2/j_0046.gif" alt="j_0046.gif" />
struct BinaryTreeNode{int _value;BinaryTreeNode *_left;BinaryTreeNode *_right;BinaryTreeNode(const int& x = 0) :_value(x), _left(NULL), _right(NULL){}};class BinaryTree{private:BinaryTreeNode *_root;public:BinaryTree(){}BinaryTree(int *PreOrder, int *InOrder,int size){if (!PreOrder || !InOrder || size <= 0)return;_root = _CreateTree(PreOrder, PreOrder + size - 1, InOrder, InOrder + size - 1);}private:BinaryTreeNode* _CreateTree(int *Pre,int *endPre,int *In,int *endIn){//構造當前根節點root int RootValue = Pre[0];BinaryTreeNode *root = new BinaryTreeNode(RootValue);//當走到最後一個元素if (Pre == endPre){//如果中序也走到了最後一個節點//最後一個節點相等說明最後一個節點是一個右分支if (In == endIn && *Pre == *In)return root;}//在中序遍曆中找到根節點int *rootIn = In;while (rootIn <= endIn && *rootIn != RootValue){//當它等於前序首元素時表示為中序的根節點++rootIn;}//找到之後計算出左子樹的節點數int leftLen = rootIn - In;//找出前序裡左子樹的構造區間int *PreLeftEnd = Pre + leftLen;if (leftLen > 0){//構造左子樹root->_left = _CreateTree(Pre + 1, PreLeftEnd , In, rootIn - 1);}if (leftLen < endPre - Pre){//構造右子樹root->_right = _CreateTree(PreLeftEnd + 1, endPre, rootIn + 1, endIn);}return root;}};int main(){int Pre[] = { 1, 2, 4, 5, 3, 6 };int In[] = { 4, 2, 5, 1, 6, 3};BinaryTree tree(Pre, In, sizeof(Pre) / sizeof(Pre[0]));getchar();return 0;}
如果實在不能理解建議在紙上將整個過程整理一遍,相信這樣就會對樹的建立以及遞迴的演算法有深刻的理解,顯然博主就經常這麼做~650) this.width=650;" src="http://img.baidu.com/hi/jx2/j_0048.gif" alt="j_0048.gif" />
本文出自 “Zimomo” 部落格,請務必保留此出處http://zimomo.blog.51cto.com/10799874/1770149
重建二叉樹