码迷,mamicode.com
首页 > 编程语言 > 详细

面试题07:重建二叉树(C++)

时间:2020-03-28 19:47:43      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:示例   etc   面试   uil   左右   重建   节点   特点   null   

题目地址:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字

题目示例

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:

3
/ \
9 20
/ \
15 7

解题思路

先序遍历规则:根节点==》左子树==》右子树

中序遍历规则:左子树==》根节点==》右子树

分析题目可知,二叉树中的节点值均是唯一的,不存在重复值。所以,我们可以利用二叉树先序遍历和中序遍历特点,完成如下的工作:

  • Step1:确定根节点,即先序遍历preorder中的首个节点;
  • Step2:在中序遍历inorder中找到根节点的索引值index,以此为界,将中序遍历序列划分为【左子树,根节点,右子树】,其中,左子树为索引值0至index,即inorder[0:index],右子树为index+1至中序遍历末尾元素,即inorder[index+1:];
  • Step3:根据中序遍历序列中左右子树的节点数量,将先序遍历序列划分为【根节点,左子树,右子树】,其中,左子树为索引值1至index+1,即preorder[1:index+1],右子树为index+1至先序遍历末尾元素,即preorder[index+1:];
  • Step4:分别利用先序遍历和中序遍历中的左子树递归构造二叉树的左子树,先序遍历和中序遍历中的右子树递归构造二叉树的右子树

程序源码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(preorder.size() == 0 || inorder.size() == 0) return NULL;
        TreeNode* treeNode = new TreeNode(preorder[0]);
        int index = distance(begin(inorder), find(inorder.begin(), inorder.end(), preorder[0]));
        vector<int> left_preorder(preorder.begin() + 1, preorder.begin() + index + 1);
        vector<int> right_preorder(preorder.begin() + index + 1, preorder.end());
        vector<int> left_inorder(inorder.begin(), inorder.begin() + index);
        vector<int> right_inorder(inorder.begin() + index + 1, inorder.end());
        treeNode->left = buildTree(left_preorder, left_inorder);
        treeNode->right = buildTree(right_preorder, right_inorder);
        return treeNode;
    }
};

面试题07:重建二叉树(C++)

标签:示例   etc   面试   uil   左右   重建   节点   特点   null   

原文地址:https://www.cnblogs.com/wzw0625/p/12588884.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!