【刷題之路】二叉樹遍歷

由一個前序以及中序遍歷重建一顆二叉樹

經典二叉樹題目,由前序遍歷可知前序遍歷的第一個數爲當前樹的頭結點;

得知當前樹的頭結點後,由中序遍歷可知左右子樹的節點數量;

這樣可以將前序遍歷,去除頭結點後,分爲兩部分,兩部分的第一個數分別爲左右子樹的頭結點;

遞歸實現,根據函數輸入不同有不同寫法,大體算法一致

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    struct TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in) {
int head=pre[0];
        int lenl,lenr;
        int i,j;
        vector<int> left_pre,left_in,right_pre,right_in;
        TreeNode *node = new TreeNode(head);  //新建樹
        for(i=0;in[i]!=head && i<in.size();i++);  //在中序遍歷中尋找頭結點位置
        lenl=i;   //左子樹節點數
        lenr=in.size()-i-1; //右子樹節點數
        for(j=0;j<i;j++){   //將左子樹前、中序遍歷放入新vector中
            left_pre.push_back(pre[j+1]); //注意此處,前序遍歷要去除當前頭結點
            left_in.push_back(in[j]);
        }
        for(j=i+1;j<in.size();j++){    //將右子樹前、中序遍歷放入新vector中,注意兩個循環
            right_pre.push_back(pre[j]);
            right_in.push_back(in[j]);
        }
        if(lenl>0) node->left=reConstructBinaryTree(left_pre,left_in);  //遞歸建立左子樹
        if(lenr>0) node->right=reConstructBinaryTree(right_pre,right_in);  //遞歸簡歷右子樹
        return node;
    }
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章