重建二叉樹

來源:互聯網
上載者:User

標籤:二叉樹

    二叉樹是我們學習資料結構階段一個重要的知識點,二叉樹又被分為滿二叉樹,完全二叉樹和其它三種來學習,所謂的滿二叉樹是指我們的二叉樹的每一個非葉子節點一定含有左孩子和右孩子,而完全二叉樹則是指我們的樹的葉子節點必須連續的分布在樹的左邊。

    今天,我們來探索一下如何在知道二叉樹前序走訪順序及中序遍曆順序來重建二叉樹

    首先,重建我們的二叉樹,必須要找到根節點,那麼根節點應該如何找到呢。如所示,根結點必定是我們前序走訪數組的首元素。在知道了根節點的情況下,我們就可以在我們的中序遍曆序列裡找到我們需要的根節點所在。只要有了根節點的位置,我們很容易就可以確定左樹節點個數,以及右樹的節點個數。而我們很清楚,在二叉樹這裡我們大多採用遞迴來解決子問題,所以顯而易見的,我們將根節點的左子樹和右子樹轉換成為子問題來解決更加容易理解。

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

重建二叉樹

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.