设二叉树按二叉链表存放,写算法判别一棵二叉树是否是一棵正则二叉树。正则二叉树是指在二叉树中不存在子树个数为1的结点。 【输入说明】二叉树的前序和中序遍历序列,以此构造二叉树的链式存储 【输出说明】若该二叉树是一棵正则二叉树,则输出Yes,否则输出No 【样例输入】 ABHDCEFG HBDAEFCG 【样例输出】 No用c++解决问题
时间: 2023-12-01 09:02:29 浏览: 78
以下是C++的代码实现:
```c++
#include <iostream>
#include <string>
#include <stack>
using namespace std;
struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char x) : val(x), left(nullptr), right(nullptr) {}
};
TreeNode* buildTree(string preorder, string inorder) {
if (preorder.empty() || inorder.empty()) {
return nullptr;
}
char rootVal = preorder[0];
int rootIndex = inorder.find(rootVal);
string leftInorder = inorder.substr(0, rootIndex);
string rightInorder = inorder.substr(rootIndex + 1);
string leftPreorder = preorder.substr(1, leftInorder.size());
string rightPreorder = preorder.substr(leftInorder.size() + 1);
TreeNode* root = new TreeNode(rootVal);
root->left = buildTree(leftPreorder, leftInorder);
root->right = buildTree(rightPreorder, rightInorder);
return root;
}
bool isRegularTree(TreeNode* root) {
if (root == nullptr) {
return true;
}
if (root->left == nullptr && root->right == nullptr) {
return true;
}
if (root->left == nullptr) {
return isRegularTree(root->right) && root->right->left != nullptr && root->right->right != nullptr;
}
if (root->right == nullptr) {
return isRegularTree(root->left) && root->left->left != nullptr && root->left->right != nullptr;
}
return isRegularTree(root->left) && isRegularTree(root->right);
}
int main() {
string preorder, inorder;
cin >> preorder >> inorder;
TreeNode* root = buildTree(preorder, inorder);
if (isRegularTree(root)) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
```
首先,我们需要通过前序遍历序列和中序遍历序列构建出二叉树。这里可以使用递归的方式进行构建,具体实现可以参考其他题解。
然后,我们需要判断这棵二叉树是否是正则二叉树。对于每个节点,如果它是叶子节点,那么它一定是正则节点;如果它只有一个子节点,那么它不是正则节点;如果它有两个子节点,那么它是正则节点当且仅当它的左右子树都是正则树。
最后,我们可以通过递归地遍历整棵树来判断它是否是正则二叉树。如果一直递归到空节点,说明当前子树是正则树;否则,根据上述规则进行判断即可。
阅读全文