判断完全二叉树 【问题描述】 给定一棵树的前序遍历和中序遍历,判断该树是否为完全二叉树 【输入形式】 一棵树的前序遍历和中序遍历 写出C++代码
时间: 2024-12-23 21:26:55 浏览: 5
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
判断一棵树是否为完全二叉树,通常需要结合前序遍历和中序遍历的特点。前序遍历(根节点 -> 左子树 -> 右子树)和中序遍历(左子树 -> 根节点 -> 右子树)对于确定二叉树的结构非常有帮助。
这里有一个基本的算法步骤:
1. 对于前序遍历,第一个元素是根节点,这将用于定位在中序遍历中的位置。
2. 中序遍历可以帮助我们找到根节点及其左右子树的范围。
3. 通过比较这两个遍历序列,我们可以确认是否有任何节点未在其父节点的右子树中。
以下是一个简单的C++函数,用于判断是否为完全二叉树:
```cpp
#include <vector>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
bool isCompleteBinaryTree(vector<int>& preorder, vector<int>& inorder) {
if (preorder.empty() || inorder.empty()) {
return true; // 空树或只有一个节点视为完全二叉树
}
TreeNode* root = buildTree(preorder, inorder);
if (!root) {
return false; // 构建失败说明不是完全二叉树
}
// 遍历检查所有节点都在其父节点的右子树
for (TreeNode* node = root; node != NULL; node = node->right) {
if (!node->left && !node->right) {
continue; // 叶子节点无需检查
}
if (!node->right || inorder[inorder.size() - 1] != node->val) {
return false;
}
inorder.pop_back();
}
return true;
}
// 辅助函数,根据前序和中序构建二叉树
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if (preorder.empty()) return nullptr;
TreeNode* root = new TreeNode(preorder[0]);
auto it = find(inorder.begin(), inorder.end(), root->val);
inorder.erase(it); // 移除根节点对应的值
root->left = buildTree(preorder.begin() + 1, inorder);
root->right = buildTree(inorder, inorder.end());
return root;
}
```
阅读全文