【C++】二叉树进阶面试题(下)

目录

6. 根据一棵树的前序遍历与中序遍历构造二叉树

题目

分析

代码

7. 根据一棵树的中序遍历与后序遍历构造二叉树

题目

分析

代码

8. 二叉树的前序遍历,非递归迭代实现 

题目

分析

代码

9. 二叉树中序遍历 ,非递归迭代实现

题目

分析

代码

10. 二叉树的后序遍历 ,非递归迭代实现

题目

分析

代码


6. 根据一棵树的前序遍历与中序遍历构造二叉树

题目

OJ链接

【C++】二叉树进阶面试题(下)_第1张图片

分析

前序遍历的第一个结点一定是根节点,根据根结点在中序结点的位置可以划分出根节点的左右结点范围,然后根据递归调用,不断地划分子树的左右结点,代码如下

代码

class Solution {
public:
    TreeNode* createTree(vector& preorder, vector& inorder,int& cur,int begin,int end)
    {
        if (begin > end)
            return nullptr;
        int root = begin;
        //寻找根节点在中序遍历的位置
        while (root <= end)
        {
            if (preorder[cur] == inorder[root])
                break;
            ++root;
        }
        TreeNode* ret = new TreeNode(preorder[cur++]);
        ret->left=createTree(preorder, inorder, cur, begin, root-1);
        ret->right=createTree(preorder, inorder, cur, root+1, end);
        return ret;
    }
    TreeNode* buildTree(vector& preorder, vector& inorder) {
        if (preorder.empty() || inorder.empty())
            return nullptr;
        int cur=0;
        int begin = 0;
        int end = inorder.size() - 1;
        return createTree(preorder, inorder,cur,begin,end);
    }
};

7. 根据一棵树的中序遍历与后序遍历构造二叉树

题目

OJ链接

分析

方法跟上一题类似,只是后续遍历的根节点要从最后一位找,并且向前遍历,同时要注意先找右子树再找左子树。

代码

class Solutio

你可能感兴趣的:(CPP,算法,数据结构,面试,c++)