笔试面试题——二叉树进阶(二)

在这里插入图片描述


北尘_:个人主页

个人专栏:《Linux操作系统》《经典算法试题 》《C++》 《数据结构与算法》

☀️走在路上,不忘来时的初心

文章目录

  • 一、二叉搜索树与双向链表
    • 1、题目讲解
    • 2、思路讲解+递归展开图
    • 3、代码实现
  • 二、从前序遍历和中序遍历中构建二叉树
    • 1、题目讲解
    • 2、思路讲解+递归展开图
    • 3、代码实现
  • 三、从中序遍历和后序遍历中构建二叉树
    • 1、题目讲解
    • 2、思路讲解
    • 3、代码实现



一、二叉搜索树与双向链表

1、题目讲解

笔试面试题——二叉树进阶(二)_第1张图片
笔试面试题——二叉树进阶(二)_第2张图片

2、思路讲解+递归展开图

笔试面试题——二叉树进阶(二)_第3张图片

笔试面试题——二叉树进阶(二)_第4张图片

3、代码实现

class Solution {
public:
	void _Convert(TreeNode* cur,TreeNode*& prev)
	{
		if(cur==nullptr)
			return;
		_Convert(cur->left,prev);
		cur->left=prev;
		if(prev)
		{
			prev->right=cur;
		}
		prev=cur;

		_Convert(cur->right,prev);
	}
    TreeNode* Convert(TreeNode* pRootOfTree) {
		TreeNode* cur=pRootOfTree,*prev=nullptr;
		 _Convert(cur,prev);

		TreeNode* root=pRootOfTree;
		while(root && root->left)
		{
			root=root->left;
		}
		return root;   
    }
};


二、从前序遍历和中序遍历中构建二叉树

1、题目讲解

笔试面试题——二叉树进阶(二)_第5张图片
笔试面试题——二叉树进阶(二)_第6张图片

2、思路讲解+递归展开图

笔试面试题——二叉树进阶(二)_第7张图片

笔试面试题——二叉树进阶(二)_第8张图片

3、代码实现

class Solution {
public:
    TreeNode* _buildTree(vector<int>& preorder, vector<int>& inorder,int& i,int begin,int end)
    {
        if(begin>end)
           return nullptr;
        int rooti=begin;
        while(rooti<=end)
        {
            if(preorder[i]==inorder[rooti])
               break;
            rooti++;
        }
        TreeNode* root=new TreeNode(preorder[i++]);
        root->left=_buildTree(preorder,inorder,i,begin,rooti-1);
        root->right=_buildTree(preorder,inorder,i,rooti+1,end);
        return root;

    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int i=0;
        TreeNode* root=_buildTree(preorder,inorder,i,0,inorder.size()-1);
        return root;
    }
};

三、从中序遍历和后序遍历中构建二叉树

1、题目讲解

笔试面试题——二叉树进阶(二)_第9张图片
笔试面试题——二叉树进阶(二)_第10张图片

2、思路讲解

笔试面试题——二叉树进阶(二)_第11张图片

3、代码实现

class Solution {
public:
    TreeNode* _buildTree(vector<int>& inorder, vector<int>& postorder,
    int& i,int begin,int end)
    {
        if(begin>end)
            return nullptr;

        int rooti=begin;
        while(begin<=end)
        {
            if(postorder[i]==inorder[rooti])
                break;
            rooti++;
        }
        TreeNode* root=new TreeNode(postorder[i--]);
        root->right=_buildTree(inorder,postorder,i,rooti+1,end);
        root->left=_buildTree(inorder,postorder,i,begin,rooti-1);
        return root;
    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        int i=postorder.size()-1;
        TreeNode* root=_buildTree(inorder,postorder,i,0,inorder.size()-1);
        return root;

    }
};

你可能感兴趣的:(经典算法试题,笔试面试题,c++,面试)