题一:从中序与后序遍历序列构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* build(vector<int>& inorder,int inbegin,int inend, vector<int>& postorder,int postbegin,int postend){
if(inbegin>inend||postbegin>postend)
return nullptr;
int Val=postorder[postend]; //这位根节点的值
int index=0;
for(int i=inbegin;i<=inend;i++){ //找到在中序遍历序列中根节点的位置
if(inorder[i]==Val){
index=i;
break;
}
}
int leftSize = inend - index;
TreeNode *root = new TreeNode(Val);
// 递归构造左右子树
root->left = build(inorder, inbegin, index - 1,
postorder, postbegin, postend-leftSize - 1);
root->right = build(inorder, index + 1, inend,
postorder, postbegin-leftSize, postend-1);
return root;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
return build(inorder,0,inorder.size()-1,postorder,0,postorder.size()-1);
}
};
题二:对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
提示:
树中节点数目在范围 [1, 1000] 内
-100 <= Node.val <= 100
进阶:你可以运用递归和迭代两种方法解决这个问题吗?
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
//对根的左子树进行中左右遍历,对右子树进行中右左遍历,只要比较两结点是否相同即可
bool isSymmetric(TreeNode* root) {
return isSymmetricCompare(root->left,root->right);
}
bool isSymmetricCompare(TreeNode* root1,TreeNode* root2){
if(root1==nullptr||root2==nullptr)
return root1==root2;
if(root1->val!=root2->val)
return false;
return isSymmetricCompare(root1->left,root2->right)&&isSymmetricCompare(root1->right,root2->left);
}
};
题三:将有序数组转换为二叉搜索树
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
示例 1:
输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
示例 2:
输入:nums = [1,3]
输出:[3,1]
解释:[1,3] 和 [3,1] 都是高度平衡二叉搜索树。
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 按 严格递增 顺序排列
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* sorted(vector<int>& nums,int begin,int end){
if(end<begin)
return nullptr;
int mid=(begin+end)/2;
TreeNode *root=new TreeNode(nums[mid]);
root->left=sorted(nums,begin,mid-1);
root->right=sorted(nums,mid+1,end);
return root;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
//利用二分查找的思想构造二叉搜索树
return sorted(nums,0,nums.size()-1);
}
};