繁体   English   中英

创建了一个用于二叉树遍历、中序和后序打印错误序列的程序

[英]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 时,我会得到:

  • 顺序:1 2 3 4 5(错误)
  • 预购:1 2 3 4 5(右)
  • 后序:5 4 3 2 1(错误)

你根本没有犯错。 但是您现在已经亲身体验了树木平衡的存在理由。 (例如红黑树或 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM