struct bnode // 结点类型
{ struct bnode * lchild ; // 左孩子指针
ElemType data ; // 抽象数据元素类型
struct bnode * rchild ; // 右孩子指针
}*root ;
生成二叉链表 C 算法1
#define LENG sizeof(struct bnode) /* 结点所占空间的大小*/
creat_tree(struct bnode ** root) / *root 是 指向指针 的指针*/
{ char ch ;
scanf("%c",&ch) ; /* 输入结点, 字符型*/
if (ch == ‘ F ’) (* root)=NULL ; /* 生成空二叉树*/
else /* 生成非空二叉树*/
{ (* root)=(struct bnode *)malloc(LENG) ;
(* root)->data=ch ; /* 生成根结点 */
creat_tree(& (* root)->lchild) ; /* 递归生成左子树*/
creat_tree(& (* root)->rchild) ; /* 递归生成右子树*/
}
return ;
}
main( ) /* 主函数*/
{ struct bnode *root ;
creat_tree(& root) ;
}
----------------------------------------------------------------
建立二叉链表算法2, 避免使用 指针的指针
#define LENG sizeof(struct bnode) // 结点所占空间的大小
struct bnode *CreatBiTree( )
{ char ch ;
struct bnode *root ; /* 二叉链表根结点指针*/
scanf("%c",&ch) ; /* 输入结点, 字符型*/
if (ch==' ')root=NULL ; /* 生成空二叉树*/
else
{ root=(struct bnode *)malloc(LENG ) ;/* 生成根结点*/
root->data=ch ;
root->lchild=CreatBiTree( ) ; /* 递归构造左子树 */
root->rchild=CreatBiTree( ) ; /* 递归构造右子树 */
}
return root ;
}
main( ) /* 主函数*/
{ struct bnode *root ;
root=CreatBiTree( ) ;
}
-------------------------------------------------------------------------------
前序遍历递归算法
preorder(struct bnode *root)
//root 为根指针
{ if (root) // 为非空二叉树
{ printf("%c,",root->data) ; // 访问根结点
preorder(root->lchild) ; // 递归遍历左子树
preorder(root->rchild) ; // 递归遍历右子树
}
}
--------------------------------------------------------------------
inorder(struct bnode *root)
//root 为根指针
{ if (root) // 为非空二叉树
{ inorder(root->lchild) ; // 递归遍历左子树
printf("%c",root->data) ; // 访问根结点
inorder(root->rchild) ; // 递归遍历右子树
}
}
-------------------------------------------------
中序遍历 非递归算法
inorder2(struct bnode *t) //t 为根指针
{ struct bnode *st[maxleng+1] ; // 定义指针( 地址) 栈st
int top=0 ; // 置空栈
do
{ while(t) // 为非空二叉树
{ if (top==maxleng) exit("overflow") ;// 栈已满, 退出
st[++top]=t ; // 根地址进栈
t=t->lchild ; //t 移向左子树
}
if (top) // 为非空栈
{ t=st[top--] ; // 弹出根地址
printf("%c",t->data) ; // 访问根结点
t=t->rchild ; // 遍历右子树
}
}
while(top||t) ;
} // 父结点未访问或 右子树未遍历
求二叉树中结点的个数
creat_tree(struct bnode **root) // 生成二叉树
{ ...........
}
preorder(struct bnode *root,int *n )// 求二叉树中结点的个数
{ if (root)
{ (*n)++ ; // 计数
preorder(root->lchild,n ) ; // 递归遍历左子树
preorder(root->rchild,n ) ; // 递归遍历右子树
}
}
main()
{ struct bnode *root ;
int n=0 ; //n 为结点数
creat_tree(&root ) ; // 假定成功生成二叉树
preorder(root,&n ) ; // 调用preorder(root,&n)
printf("%d",n) ; // 输出结点数n
}