zoukankan      html  css  js  c++  java
  • 重建二叉树

    重建二叉树
    • 参与人数:2411时间限制:1秒空间限制:32768K
    • 通过比例:18.41%
    • 最佳记录:0 ms|0K(来自  心无杂念

    题目描述

    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

    /**

    前序遍历的结果中,第一个结点一定是根结点,然后在中序遍历的结果中查找这个根结点,根结点左边的就是左子树,根结点右边的就是右子树,递归构造出左、右子树即可。

    示意图如图所示:

    利用前序和中序遍历的结果重建二叉树

     **/

    /**
     * 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) {
            struct TreeNode *bt = (TreeNode*)malloc(sizeof(TreeNode));
            bt->val = pre[0];
            int index = 0;
            for (int i = 0; i < in.size(); i++){
                if (pre[0] == in[i]){
                    index = i;
                    break;
                }
            }
    		vector<int> inL(in.begin(),in.begin()+index);
    		vector<int> inR(in.begin()+index+1,in.end());
    
    		vector<int> preL(pre.begin()+1,pre.begin()+inL.size()+1);
    		vector<int> preR(pre.begin()+inL.size()+1,pre.end());
     
        	if(index==0)
                bt->left = NULL;
            else
                bt->left = reConstructBinaryTree(preL, inL);
            if(preR.size() == 0)
                bt->right = NULL;
            else
                bt->right = reConstructBinaryTree(preR, inR);
            return bt;
        }
    };
    

      

      

  • 相关阅读:
    AxWindowsMediaPlayer的详细用法
    C# Windows Media Player控件的常用属性及方法
    C#中winform使用相对路径读取文件的方法
    DataGridView控件在加载数据时产生的闪烁问题
    浅谈C#中的双缓冲
    几种C#实现播放声音的方法
    C#下实现软件欢迎界面
    DataGridView控件内建立日期选择编辑列
    程序员值得看的电影(20170420EDIT)
    员工照片
  • 原文地址:https://www.cnblogs.com/qianmacao/p/4839660.html
Copyright © 2011-2022 走看看