1.二叉树的层次遍历 II
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
思路:利用队列存放树进行层次遍历(队列不断更新存储的是同一层节点)。while判断队列是否为空,在while里for循环遍历队列中包含的同一层,并根据左右子树更新队列。
/**
* 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:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> res;
if(root == NULL)
return res;
queue<TreeNode*> q; //队列,用于放树
q.push(root); //树根节点压入
while(!q.empty())
{
vector<int> temp; //临时变量
int len = q.size(); //队列长度
for(int i=0;i<len;i++)
{
TreeNode* now = q.front(); //获得队列第一个
q.pop(); //弹出队列第一个
temp.push_back(now->val); //得到队列第一个的值
if(now->left) //判断左右子节点是否在,在就压入队列
q.push(now->left);
if(now->right)
q.push(now->right);
}
res.insert(res.begin(),temp); //将临时变量插入到最前端
}
return res;
}
};
参考链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/submissions/
2.将有序数组转换为二叉搜索树
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
思路:二分递归,二分法实现左右子树资源的平均分配。递归知道左右只剩1个或0个节点。
/**
* 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* sortedArrayToBST(vector<int>& nums) {
if (nums.size()==0)
return NULL;
if(nums.size()==1)
return new TreeNode(nums[0]);
int middle = nums.size() / 2;
TreeNode *root = new TreeNode(nums[middle]);
vector<int> nums_left(nums.begin(),nums.begin()+middle);
vector<int> nums_right(nums.begin()+middle+1,nums.end());
root->left = sortedArrayToBST(nums_left);
root->right = sortedArrayToBST(nums_right);
return root;
}
};
参考链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/