文章目录
- 一、二叉搜索树与双向链表
- 1、题目讲解
- 2、思路讲解+递归展开图
- 3、代码实现
- 二、从前序遍历和中序遍历中构建二叉树
- 1、题目讲解
- 2、思路讲解+递归展开图
- 3、代码实现
- 三、从中序遍历和后序遍历中构建二叉树
- 1、题目讲解
- 2、思路讲解
- 3、代码实现
一、二叉搜索树与双向链表
1、题目讲解
2、思路讲解+递归展开图
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、题目讲解
2、思路讲解+递归展开图
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、题目讲解
2、思路讲解
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;
}
};