二叉树是一种重要的数据结构,总体来讲它是由根节点和左子树、右子树组成,具有几种不同的形态,分别是空树、只有根节点、只有根节点和左子树、只有根节点和右子树、有根节点以及左右子树。二叉树的左右子树是具有左右区分的。二叉树还具有一些特殊的结构,如斜二叉树、完全二叉树和完美二叉树,遍历一颗二叉树一般有四种方法,先序遍历、中序遍历、后序遍历和层序遍历。
1、二叉树的几个重要性质
(1)一个二叉树第i层最多节点数为2^(i-1),i>=1;
(2)深度为k的二叉树最大节点总数2^k-1;
(3)对任何非空的二叉树,如果其叶子节点数为n0,度为2的节点数为n2,则有关系试n0=n2+1成立。
2、二叉树遍历的递归算法
(1)抽象数据类型定义
typedef struct TreeNode{
int data;
struct TreeNode *Left;
struct TreeNode *Right;
}BinTree;
(2)遍历算法接口
BinTree* creatBinTree(); --创建一颗树
void PreOrderTraversal(BinTree *BT); --先序遍历二叉树
void MidOrderTraversal(BinTree *BT); --中序遍历二叉树
void PostOrderTraversal(BinTree *BT); --后序遍历二叉树
(3)算法代码
BinTree* creatBinTree()
{
BinTree *BT;
BT=(BinTree*)malloc(sizeof(BinTree));
BT->Left=NULL;
BT->Right=NULL;
return BT;
}
void PreOrderTraversal(BinTree *BT)
{
if(BT!=NULL)
{
printf("%d ",BT->data);
PreOrderTraversal(BT->Left);
PreOrderTraversal(BT->Right);
}
}
void MidOrderTraversal(BinTree *BT)
{
if(BT!=NULL)
{
PreOrderTraversal(BT->Left);
printf("%d ",BT->data);
PreOrderTraversal(BT->Right);
}
}
void PostOrderTraversal(BinTree *BT)
{
if(BT!=NULL)
{
PreOrderTraversal(BT->Left);
PreOrderTraversal(BT->Right);
printf("%d ",BT->data);
}
}
int main()
{
BinTree *BT=creatBinTree();
BT->data=12;
PreOrderTraversal(BT);
return 0;
}
3、二叉树的非递归算法
非递归算法需要借助堆栈实现,堆栈的实现这里直接使用。
void PreOrderTraversal(BinTree *BT)
{
BinTree *T;
stack *s=createStack();
while(T!=NULL)
{
while(T)
{
Push(s,T);
printf("%d ",T->data);
T=T->Left;
}
if(!isEmpty(s))
{
T=Pop(s);
T=T->Right;
}
}
}
void MidOrderTraversal(BinTree *BT)
{
BinTree *T;
stack *s=createStack();
while(T!=NULL)
{
while(T)
{
Push(s,T);
T=T->Left;
}
if(!isEmpty(s))
{
T=Pop(s);
printf("%d ",T->data);
T=T->Right;
}
}
}
//思路:使用根-右-左的顺序先序遍历,压到另外一个堆栈中,然后倒序输出。
void PostOrderTraversal(BinTree *BT)
{
BinTree *T;
stack *s=createStack();
stack *q=createStack();
while(T!=NULL)
{
while(T)
{
Push(s,T);
Push(q,T); //压进堆栈,便于倒序输出
T=T->Right;
}
if(!isEmpty(s))
{
T=Pop(s);
T=T->Left;
}
}
while(!isEmpty(q))//倒序输出
{
BinTree *re=Pop(q);
printf("%d ",re->data);
}
}