二叉树:
二叉树是一类非常重要的特殊的树形结构
在二叉树中,每个结点至多有2个儿子,并且有 左、右之分。
位于左边的孩子叫做左孩子 位于右边的孩子叫做右孩子
二叉树 VS 普通树 、有序树:
二叉树与度数不超过2的树不同,与度数不超过2 的有序树也不同。 在普通的树中,若结点只有一个儿子,无左右 之说。
在有序树中,虽然一个结点的儿子之间是有左 右次序的,但若该结点只有一个儿子时,就无须 区分其左右次序。
而在二叉树中,即使是一个儿子也有左右之分
二叉树结点及二叉树的定义:
typedef struct Node
{
DataType data;
struct Node *LChild;
struct Node *RChild;
} Bitnode, BiTree;
二叉树的创建:
void CreateBiTree(BiTree bt)
{
char ch; ch = getchar();
if(ch'.') bt=NULL;
else
{
bt=(BiTree)malloc(sizeof(BiTNode));
(bt)->data=ch; CreateBiTree(&((bt)->LChild)); //生成左子树
CreateBiTree(&((bt)->RChild)); //生成右子树
}
}
二叉树的遍历:
先序遍历 先序列表 最先访问根
中序遍历 中序列表 中间访问根
后序遍历 后序列表 最后访问
先序遍历代码:
void PreOrder(BiTree root)
{
if ( root!=NULL )
{
Visit(root->data);//访问根结点
PreOrder(root->LChild);
PreOrder(root->RChild);
}
}
中序遍历代码:
void InOrder(BiTree root)
{
if ( root!=NULL )
{
InOrder(root->LChild);
Visit(root->data);//访问根结点
InOrder(root->RChild);
}
}
后序遍历代码:
void PostOrder(BiTree root)
{
if ( root!=NULL )
{
PostOrder(root->LChild);
PostOrder(root->RChild);
Visit(root->data);//访问根结点
}
}
:二叉树的递归遍历算法的时间复杂度是:O(n)
创建二叉树以及运用先序遍历输出
include<stdio.h>
include<stdlib.h>
//树的定义(结点定义)
typedef char DataType;
typedef struct Node {
DataType data;
struct Node *lchild;
struct Node rchild;
} BiNode,BiTree;
//创建树的二叉链表(递归)
void CreateBiTree(BiTree bt)
{
char ch;
ch = getchar();
if(ch'.') {bt=NULL;}
else
{
bt= (BiNode )malloc(sizeof(BiNode));
(bt)->data=ch;
CreateBiTree(&((bt)->lchild)); //生成左子树
CreateBiTree(&((bt)->rchild)); //生成右子树
}
}
//输出二叉树的元素(先序)
void Print(BiTree bt)
{
if(bt!=NULL)
{
printf("%c", bt->data);
Print(bt->lchild);
Print(bt->rchild);
}
}
//主函数
void main()
{
BiTree T;
DataType x;
CreateBiTree(&T);
printf("先序:");
Print(T);
}