Day16——二叉树III
目标:
● 104.二叉树的最大深度
● 559.n叉树的最大深度
● 111.二叉树的最小深度
● 222.完全二叉树的节点个数
104.二叉树的最大深度
思路:递归遍历二叉树,每次访问子节点deep+1
int maxDeep;
void order(TreeNode* node, int deep) {
maxDeep = max(maxDeep, deep);
if(node == nullptr) return;
order(node->left, deep + 1);
order(node->right, deep + 1);
}
int maxDepth(TreeNode* root) {
if(root == nullptr) return 0;
maxDeep = 0;
int deep = 0;
order(root->left, deep + 1);
order(root->right, deep + 1);
return maxDeep;
}
n叉树差不多, 区别在于访问子树。
int maxDeep;
void order(Node* node, int deep) {
maxDeep = max(maxDeep, deep);
if(node == nullptr) return;
for(auto i : node->children) {
order(i, deep + 1);
}
return;
}
int maxDepth(Node* root) {
if(root == nullptr) return 0;
maxDeep = 0;
int deep = 0;
order(root, deep + 1);
return maxDeep;
}
111.二叉树的最小深度
思路:递归访问节点,
确定循环结束条件:cur为空时,深度为0;
cur->left == nullptr, 则深度取右子树+1
cur->right == nullptr, 则深度取左子树+1
否不为空,取最小子树+1;
int minDepth(TreeNode* root) {
if(root == nullptr) return 0;
if(root->left == nullptr) return 1 + minDepth(root->right);
else if(root->right== nullptr) return 1 + minDepth(root->left);
return 1 + min(minDepth(root->right), minDepth(root->left));
}
222.完全二叉树的节点个数
思路:复习一下中序遍历,
需要临时节点辅助,先一直遍历到左节点为空,再开始从栈中读取元素,保证左——根右。
int countNodes(TreeNode* root) {
int res = 0;
if(root == nullptr) return res;
stack<TreeNode*> st;
TreeNode* cur = root;
while(!st.empty() || cur != nullptr) {
if(cur != nullptr) {
st.push(cur);
cur = cur->left;
} else {
cur = st.top();
st.pop();
++res;
cur = cur->right;
}
}
return res;
}