【问题标题】:Tree elements not displaying in correct order树元素未按正确顺序显示
【发布时间】:2015-04-17 20:19:57
【问题描述】:

我正在尝试构建一个简单的树程序并以中序、预序和后序格式遍历它。我使用的代码是这样的:

#include <stdio.h>
#include <stdlib.h>

struct node
{
    int info;
    struct node* lchild;
    struct node* rchild;
};
typedef struct node* NODE;

NODE getNode()
{
    NODE temp;
    temp = (NODE)malloc(sizeof(struct node));
    return temp;
}

NODE insert(NODE root,int item)
{
    NODE temp,prev,cur;
    temp = getNode();
    temp->info = item;
    temp->lchild = NULL;
    temp->rchild = NULL;
    if(root==NULL)
    {return temp;}
    prev = NULL;
    cur = root;
    while(cur!=NULL)
    {
        prev = cur;
        if(item<cur->info)
        {
            cur = cur->lchild;
        }
        else if(item>cur->info)
        {
            cur = cur->rchild;
        }
    }
    if(item<prev->info)
    {
        prev->lchild = temp;
    }
    else if(item>prev->info)
    {
        prev->rchild = temp;
    }
    return root;
}

void inorderTraversal(NODE root)
{
    if(root!=NULL)
    {
        inorderTraversal(root->lchild);
        printf("%d\t",root->info);
        inorderTraversal(root->rchild);
    }
    else
    {
        return;
    }
}

void preorderTraversal(NODE root)
{
    if(root!=NULL)
    {
        printf("%d\t",root->info);
        preorderTraversal(root->lchild);
        preorderTraversal(root->rchild);
    }
    else
    {
        return;
    }
}

void postorderTraversal(NODE root)
{
    if(root!=NULL)
    {
        postorderTraversal(root->lchild);
        postorderTraversal(root->rchild);
        printf("%d\t",root->info);
    }
    else
    {
        return;
    }
}





int main() {

    NODE root;
    root = getNode();
    root = NULL;
    root = insert(root,10);
    root = insert(root,20);
    root = insert(root,15);
    printf("Root is: %d\n",root->info);
    printf("Inorder Traversal is :");
    inorderTraversal(root);
    printf("\n");
    printf("Preorder traversal is :");
    preorderTraversal(root);
    printf("\n");
    printf("Postorder traversal is :");
    postorderTraversal(root);
    printf("\n");
    return 0;
}

我得到的输出是这样的:

根是:10 中序遍历是:10 15 20
前序遍历是:10 20 15
后序遍历为:15 20 10

即10 被分配为根,理想情况下它应该是 15,左边是 10,右边是 15。 这里有什么错误,我该如何解决?

谢谢!

【问题讨论】:

  • 不,不应该,您先插入 10 作为根,然后再添加 20 和 15 个节点。
  • 是的,但是既然这是一个BST,Ltree不应该比root小,Rtree应该比root大吗?
  • 您似乎混淆了前序遍历和中序遍历。顺序应该是您实施预购的方式。
  • 不相关:如果您插入相同的值两次,您的代码就会出现无限循环。考虑一下当cur-&gt;info == item 时插入函数的while(cur!=NULL) 循环将如何中断。
  • 据我所知,您创建的树有 10 个作为根,20 个作为其右孩子,20 个有 15 个作为其左孩子。我想你可能会追求自我平衡树:en.wikipedia.org/wiki/Self-balancing_binary_search_tree

标签: c tree binary-search-tree tree-traversal


【解决方案1】:

你最终得到的树结构如下所示

                    10
                      \
                       20
                     /
                   15

遍历顺序如下: 按顺序:10 15 20 预购:10 20 15 后订购:15 20 10

BST 确实保持了左子树中的元素小于右子树中的元素的属性。但是,他们不像 AVL 或红黑树那样做self-balancing

【讨论】:

  • 哦,是的。看来我把两者混为一谈了。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多