随笔 - 147  文章 - 5  评论 - 6  阅读 - 81298

CLRS 10.4-5

用先序遍历的想法,分为以下集中情况

1。对1个节点,先访问它,若它有左孩子,则继续访问左孩子

2。若节点无左孩子但是有右孩子,则访问右孩子

3。若节点无左右孩子,表示访问到1个也节点,这是要寻找下1个要访问的节点即它的先序后继节点,寻找它的方法是,一直遍历它的父辈节点,知道某父辈节点是父父辈节点的左孩子并且父父辈节点的右孩子存在,这个右孩子还没有被访问过,即是要寻找的节点,其他情况则一直向上父辈节点回溯

 

代码如下: 

#include<iostream>
#include<cstdlib>
using namespace std;
 
typedef char Elemtype;
typedef struct node
{
    Elemtype data;
    struct node* left;
    struct node* right;
    struct node* parent;
}Tree;
 
//先序建立一个树,不存在的元素都用0代替
Tree* create_tree(void)
{
    Tree* root=NULL;
    char ch;
 
    cin>>ch;
    if(ch=='0')
        return NULL;
    else if(ch=='q')
        return root;
    else
    {
            root=(Tree*)malloc(sizeof(Tree));
            root->data=ch;
            root->parent=NULL;
            root->left=create_tree();
            root->right=create_tree();
            if(root->left)
                root->left->parent=root;
            if(root->right)
                root->right->parent=root;
    }
    return root;
}
 
 
 
//习题10.4-5
void order(Tree* t)
{
    Tree* p=t;
 
    while(p)
    {
        cout<<p->data<<" ";
        if(p->left!=NULL)
        {
            p=p->left;
            continue;
        }
        else if(p->right!=NULL)
        {
            p=p->right;
            continue;
        }else //都空
        {
            while(true)
            {
                if(p==t)
                    return ;
                if(p==p->parent->right)
                    p=p->parent;
 
                if(p==t)
                    return;
                if(p==p->parent->left && p->parent->right==NULL)
                    p=p->parent;
                else if(p==p->parent->left && p->parent->right!=NULL)
                {
                    p=p->parent->right;
                    break;
                }
            }
        }
    }
 
    cout<<endl;
}
 
void preorder(Tree* t)
{
    if(t)
    {
        cout<<t->data<<" ";
        preorder(t->left);
        preorder(t->right);
    }
}
 
void free_tree(Tree* t)
{
    if(t)
    {
        free_tree(t->left);
        free_tree(t->right);
        free(t);
    }
}
int main(void)
{
    Tree *root;
    root=create_tree();
 
    preorder(root);
    cout<<endl;
 
    order(root);
    return 0;
}

用先序顺序建立树,NULL节点用0表示,例如建立树ab0dc00e00fg0ik000hj000q,可以看到它们输出一样,都是先序顺序

posted on   紫金树下  阅读(317)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2012-03-24 [转载]Linux中硬链接和软链接的区别和联系
< 2013年3月 >
24 25 26 27 28 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 6

点击右上角即可分享
微信分享提示