[英]Created a program for binary tree traversal, inorder and postorder print wrong sequences
我制作了一个程序,该程序接受用户输入来创建二叉树,并带有根据用户输入遍历所述树的选项。 插入和 Preorder 遍历工作正常,但由于某种原因,Inorder 遍历打印与 Preorder 相同的 output,而 Postorder 遍历向后打印输入。 我已经检查了我的插入和遍历功能一百万次,但我看不出哪里出错了......非常感谢帮助!
#include <iostream>
using namespace std;
struct Node {
int data;
Node *right;
Node *left;
};
Node *createNode(int data) {
Node *temp = new Node();
temp->data = data;
temp->right = temp->left = NULL;
return temp;
}
void insertNode(Node* &root, int data) {
if(root == NULL)
root = createNode(data);
else if(root->data > data)
insertNode(root->left, data);
else
insertNode(root->right, data);
}
void printInorder(Node *root) {
if(root != NULL){
printInorder(root->left);
cout << root->data << " ";
printInorder(root->right);
}
}
void printPreorder(Node *root) {
if(root != NULL){
cout << root->data << " ";
printPreorder(root->left);
printPreorder(root->right);
}
}
void printPostorder(Node *root) {
if(root != NULL){
printPostorder(root->left);
printPostorder(root->right);
cout << root->data << " ";
}
}
int main()
{
Node *root = NULL;
int n, val;
int treeOp;
do {
cout << "\nBINARY TREE OPTIONS";
cout << "\n------------------------------\n";
cout << "(1) Insert element(s)";
cout << "\n(2) Inorder traversal";
cout << "\n(3) Preorder traversal";
cout << "\n(4) Postorder traversal";
cout << "\n(5) Return to main menu\n\n";
cout << "Enter the number of your choice: ";
cin >> treeOp;
cout << endl;
switch(treeOp) {
case 1:
cout << "How many elements will you insert: ";
cin >> n;
cout << "\nInsert " << n <<" elements, hit enter after each:\n";
for(int i=0; i < n; i++) {
cin >> val, insertNode(root, val);
}
cout << "\nElement(s) inserted!" << endl;
break;
case 2:
if(root == NULL) {
cout << "\nNo elements found!\n";
} else {
cout << "INORDER TRAVERSAL OF YOUR BINARY TREE: " << endl;
printInorder(root);
cout << endl;
}
break;
case 3:
if(root == NULL) {
cout << "\nNo elements found!\n";
} else {
cout << "PREORDER TRAVERSAL OF YOUR BINARY TREE: " << endl;
printPreorder(root);
cout << endl;
}
break;
case 4:
if(root == NULL) {
cout << "\nNo elements found!\n";
} else {
cout << "POSTORDER TRAVERSAL OF YOUR BINARY TREE: " << endl;
printPostorder(root);
cout << endl;
}
break;
default:
if(treeOp!=5){
cout << "\nInput invalid, please try again\n";
}
}
} while (treeOp != 5);
return 0;
}
不确定我在上面的解释中是否清楚,但基本上当我插入 1 2 3 4 5 时,我会得到:
你根本没有犯错。 但是您现在已经亲身体验了树木平衡的存在理由。 (例如红黑树或 AVL 树)
使用您的代码按该顺序插入“1 2 3 4 5”,得到以下树(也称为链表):
1
2
3
4
5
如果您将输入更改为“3 1 2 4 5”,您将得到一个更加平衡的树:
3
1 4
2 5
输入 (1,2,3,4,5) 被排序,并且在插入它们时会产生倾斜的树结构。
> 1
> / \
> left(1) 2
> / \
> left(2) 3
> / \
> left(3) 4
> / \
> left(4) 5
> / \
> left(5) right(5)
在前序遍历的情况下,所有左侧节点都是 NULL,因此它将首先打印根并向右移动。 所以,在前序遍历中它应该打印
左(1)---->1--->左(2)--->2--->左(3)--->3--->(左4)---->4 ---->(左5)--->5---->右(5)
由于给定的输入 left(1)、left(2)、left(3)、left(4)、left(5) 和 right(5) 是 null,因此序列打印为 1、2、3、4, 5 对于前序遍历是正确的。
同样,您可以对其他遍历进行分析。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.