数据结构-二叉树的创建?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构-二叉树的创建?相关的知识,希望对你有一定的参考价值。

  如果要在内存中建立一个如下左图这样的树,wield能让每个结点确认是否有左右孩子,我们对它进行扩展,变成如下右图的样子,也就是将二叉树中的每个结点的空指针引出一个虚结点,其值为一个特定值,比如”#”,称之为扩展二叉树。扩展二叉树就可以做到一个遍历序列确定一棵二叉树了。如前序遍历序列为AB#D##C##。

  

  有了这样的准备,就可以看看如何生成一棵二叉树了。假设二叉树的结点均为一个字符,把刚才前序遍历序列AB#D##C##用键盘挨个输入,实现的算法如下所示。

  二叉树建立实现代码一,如下所示。

//创建树
//按先后次序输入二叉树中结点的值(一个字符),#表示空树
//构造二叉链表表示的二叉树
BiTree CreateTree(BiTree t)

    char ch;
    scanf("%c", &ch);
 
    if(ch == '#')
    
        t = NULL;
    
    else
    
        t = (BitNode *)malloc(sizeof(BitNode));
        if(t == NULL)
        
            fprintf(stderr, "malloc() error in CreateTree.\\n");
            return;
        
 
        t->data = ch;                        //生成根结点
        t->lchild = CreateTree(t->lchild);    //构造左子树
        t->rchild = CreateTree(t->rchild);    //构造右子树
    
    return t;

  二叉树建立实现代码二,如下所示。

//创建树方法二
int CreateTree2(BiTree *t)

    char ch;
    scanf("%c", &ch);
 
    if(ch == '#')
    
        (*t) = NULL;
    
    else
    
        (*t) = (BiTree)malloc(sizeof(BitNode));
        if((*t) == NULL)
        
            fprintf(stderr, "malloc() error in CreateTree2.\\n");
            return ERROR;
        
 
        (*t)->data = ch;
        CreateTree2(&((*t)->lchild));
        CreateTree2(&((*t)->rchild));
    
    return OK;

  其实建立二叉树,也是利用了递归的原理。只不过在原来应该打印结点的地方,改成生成结点、给结点赋值的操作而已。因此,完全可以用中序或后序遍历的方式实现二叉树的建立,只不过代码里生成结点和构造左右子树的代码顺序交互一下即可。

参考技术A #include <stdio.h>
#define ElemType char
//节点声明,数据域、左孩子指针、右孩子指针
typedef struct BiTNode
char data;
struct BiTNode *lchild,*rchild;
BiTNode,*BiTree;
//先序建立二叉树
BiTree CreateBiTree()
char ch;
BiTree T;
scanf('%c',&ch);
if(ch=='#')T=NULL;
else
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
T->lchild = CreateBiTree();
T->rchild = CreateBiTree();

return T;//返回根节点

//先序遍历二叉树
void PreOrderTraverse(BiTree T)
if(T)
printf('%c',T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);


//中序遍历
void InOrderTraverse(BiTree T)
if(T)
PreOrderTraverse(T->lchild);
printf('%c',T->data);
PreOrderTraverse(T->rchild);


//后序遍历
void PostOrderTraverse(BiTree T)
if(T)
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
printf('%c',T->data);


void main()
BiTree T;
T = CreateBiTree();//建立
PreOrderTraverse(T);//输出
getch();
本回答被提问者和网友采纳

以上是关于数据结构-二叉树的创建?的主要内容,如果未能解决你的问题,请参考以下文章

数据结构之树(Tree)_二叉树的创建及遍历概述

数据结构之二叉树二叉树的创建遍历等操作

数据结构之二叉树的实现

二叉树的创建和遍历

二叉树的建立及基本操作

Java实现二叉树的创建递归/非递归遍历