【问题描述】设二叉树按二叉链表存放,写算法判别一棵二叉树是否是一棵正则二叉树。正则二叉树是指在二叉树中不存在子树个数为1的结点。 【输入说明】二叉树的前序和中序遍历序列,以此构造二叉树的链式存储 【输出说明】若该二叉树是一棵正则二叉树,则输出Yes,否则输出No 【样例输入】 ABHDCEFG HBDAEFCG 【样例输出】 No
时间: 2023-12-01 13:02:11 浏览: 64
设一棵二叉树以二叉链表表示,试编写有关二叉树的递归算法
5星 · 资源好评率100%
以下是 C++ 实现判别一棵二叉树是否是一棵正则二叉树的代码:
```c++
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* buildTree(string preorder, string inorder) {
if (preorder.empty() || inorder.empty()) return NULL;
TreeNode* root = new TreeNode(preorder[0]);
int pos = inorder.find(preorder[0]);
root->left = buildTree(preorder.substr(1, pos), inorder.substr(0, pos));
root->right = buildTree(preorder.substr(pos+1), inorder.substr(pos+1));
return root;
}
bool isRegular(TreeNode* root) {
if (!root) return true;
if (!root->left && !root->right) return true;
if (!root->left || !root->right) return false;
return isRegular(root->left) && isRegular(root->right);
}
int main() {
string preorder, inorder;
cin >> preorder >> inorder;
TreeNode* root = buildTree(preorder, inorder);
if (isRegular(root)) cout << "Yes" << endl;
else cout << "No" << endl;
return 0;
}
```
在这个代码中,我们首先定义了二叉树结点的结构体 TreeNode。然后实现了一个 buildTree() 函数,根据二叉树的前序和中序遍历序列构建二叉树。
接着实现了一个 isRegular() 函数,用于判断一棵二叉树是否是正则二叉树。如果一棵二叉树为空,或者不存在子树个数为1的结点,那么这棵二叉树就是正则二叉树。我们可以通过递归的方式判断左右子树是否都有结点,来判断当前结点是否存在子树个数为1的情况。
最后在主函数中,读入二叉树的前序和中序遍历序列,构建二叉树,并判断是否为正则二叉树。如果是,输出 Yes,否则输出 No。
注意,在实现 buildTree() 函数时,我们使用了 string 类的 substr() 函数来截取字符串。在实现 isRegular() 函数时,我们使用了递归的方式,每次判断左右子树是否都有结点。
阅读全文