【刷题之路】二叉树遍历

来源:互联网 发布:看视频软件有卡顿 编辑:程序博客网 时间:2024/06/04 01:25

由一个前序以及中序遍历重建一颗二叉树

经典二叉树题目,由前序遍历可知前序遍历的第一个数为当前树的头结点;

得知当前树的头结点后,由中序遍历可知左右子树的节点数量;

这样可以将前序遍历,去除头结点后,分为两部分,两部分的第一个数分别为左右子树的头结点;

递归实现,根据函数输入不同有不同写法,大体算法一致

/**
 * 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;
    }
};

0 0
原创粉丝点击