二叉树的最大深度
1.深度遍历(DFS)
从根节点一直往下递归遍历,比较左右子树的高度,每进入一次递归高度+1,直到叶子结点都为空时退出递归。
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root == nullptr) return 0;
return max(maxDepth(root -> left), maxDepth(root -> right)) + 1;
}
};
2.层次遍历
层次遍历,一层一层开始,定义一个结点指针类型的队列,从根节点开始,入队,然后当队列不为空时进入循环,记录当前队列长度,利用队列的长度为0表示成功遍历该层的条件,将每个结点pop出进入队列后,将其队列长度-1,若每个结点的左右子树不为空,则放入队列,退出第二层循环,记录高度+1,最终退出循环即可得到高度。
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root == nullptr) return 0;
queue<TreeNode*> Q; // 是queue不是Queue
int ans = 0;
Q.push(root);
while(!Q.empty()) {
int len = Q.size();
while(len > 0) {
TreeNode* temp = Q.front();
Q.pop();
len--;
if(temp -> left) Q.push(temp -> left);
if(temp -> right) Q.puth(temp -> right);
}
ans++;
}
return ans;
}
};
验证二叉搜索树
根据二叉搜索树的特征,我们应该要想到中序遍历(根左右),中序遍历二叉搜索树得到的应该是一个升序序列。所以在用中序序列遍历时,若当前结点的值小于等于前序结点,则返回false.
class Solution {
public:
bool isValidBST(TreeNode* root) {
stack<TreeNode*> s;
long long preorder = (long long)INT_MIN - 1;
while(!s.empty() || root != nullptr) {
while(root != nullptr) {
s.push(root);
root = root -> left;
}
root = s.top();
s.pop();
if(root -> val <= preorder) {
return false;
}
preorder = root -> val;
root = root -> right;
}
return true;
}
};