二叉树的最大深度
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树[3,9,20,null,null,15,7]
,3 / \ 9 20 / \ 15 7返回它的最大深度 3 。
思路:当前结点深度等于左右子树中较大的那个深度加一。
/**
* 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:
int maxDepth(TreeNode* root) {
if(root==NULL)return 0;
int A = maxDepth(root->left);
int B = maxDepth(root->right);
return A>B? A+1:B+1;
}
};
验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入: 2 / \ 1 3 输出: true示例 2:
输入: 5 / \ 1 4 / \ 3 6 输出: false 解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为 5 ,但是其右子节点值为 4 。
思路:二叉搜索树的中序遍历是一个递增序列,因此我的做法就是简单中序遍历这颗树,然后对得到的序列判断是否递增即可。
/**
* 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 {
private:
vector<int> ord;
public:
void inorder(TreeNode* root){
if(root == NULL)
return;
inorder(root->left);
ord.push_back(root->val);
inorder(root->right);
}
bool isValidBST(TreeNode* root) {
if(root == NULL)return true;
inorder(root);
for(int i=0;i<ord.size()-1;i++)
if(ord[i]>=ord[i+1])
return false;
return true;
}
};
二叉树的层次遍历
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树:[3,9,20,null,null,15,7]
,3 / \ 9 20 / \ 15 7返回其层次遍历结果:
[ [3], [9,20], [15,7] ]
思路:层序便利二叉树是典型的广度优先搜索BFS的应用,依次将每一层放入队列中,用一个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>> levelOrder(TreeNode* root) {
vector<vector<int>> ret;
queue<TreeNode*> q;
if(root == NULL) return ret;
q.push(root);
while(q.empty()==false){
vector<int> oneLevel;
int size = q.size();
for(int i=0;i<size;++i){
TreeNode* node= q.front();
oneLevel.push_back(node->val);
q.pop();
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
ret.push_back(oneLevel);
}
return ret;
}
};
将有序数组转换为二叉搜索树
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5
/**
* 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) {
return sortedArrayToBST(nums,0,nums.size()-1);
}
TreeNode* sortedArrayToBST(vector<int>& nums,int left,int right){
if(left>right) return NULL;
int mid = (right+left)/2;
TreeNode * node = new TreeNode(nums[mid]);
node->left = sortedArrayToBST(nums,left,mid-1);
node->right = sortedArrayToBST(nums,mid+1,right);
return node;
}
};