二叉树经典例题的题解
本文将为大家详细介绍几个经典的二叉树例题,并提供对应的解题思路和代码实现。
1. 二叉树的遍历
二叉树的遍历是二叉树操作中最基础的操作。它分为三种遍历方式:前序遍历、中序遍历和后序遍历。其中,前序遍历是按照“根左右”顺序遍历,中序遍历是按照“左根右”顺序遍历,后序遍历是按照“左右根”顺序遍历。
遍历的实现方式主要有两种:递归和非递归。递归实现比较简单,非递归实现可以利用栈来实现。
以下是前序遍历的递归实现:
void preorderTraversal(TreeNode* root) {
if (root != nullptr) {
cout << root->val << ' ';
preorderTraversal(root->left);
preorderTraversal(root->right);
}
}
以下是前序遍历的非递归实现:
void preorderTraversal(TreeNode* root) {
if (root == nullptr) return;
stack<TreeNode*> st;
st.push(root);
while (!st.empty()) {
TreeNode* node = st.top();
st.pop();
cout << node->val << ' ';
if (node->right != nullptr) st.push(node->right);
if (node->left != nullptr) st.push(node->left);
}
}
2. 二叉树的最大深度
二叉树的最大深度是指从根节点到叶子节点的最长路径上的节点数。求二叉树的最大深度可以使用递归或BFS(广度优先搜索)实现。
以下是递归实现:
int maxDepth(TreeNode* root) {
if (root == nullptr) return 0;
int leftDepth = maxDepth(root->left);
int rightDepth = maxDepth(root->right);
return 1 + max(leftDepth, rightDepth);
}
以下是BFS实现:
int maxDepth(TreeNode* root) {
if (root == nullptr) return 0;
int depth = 0;
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
int size = q.size();
depth++;
for (int i = 0; i < size; i++) {
TreeNode* node = q.front();
q.pop();
if (node->left != nullptr) q.push(node->left);
if (node->right != nullptr) q.push(node->right);
}
}
return depth;
}
3. 判断两个二叉树是否相同
判断两个二叉树是否相同可以通过递归实现。具体做法是比较两个根节点的值是否相等,再分别比较左子树和右子树是否相同。
以下是代码实现:
bool isSameTree(TreeNode* p, TreeNode* q) {
二叉树中序遍历非递归算法 if (p == nullptr && q == nullptr) return true;
if (p == nullptr || q == nullptr) return false;
if (p->val != q->val) return false;
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
以上就是本文的二叉树经典例题的题解,希望对大家有所帮助。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论