typedef struct BiNode
{
ElemType data;
struct BiNode* lchild, * rchlid;//左右孩子指针
}BiNode,*BiTree;
三种遍历方法(递归):
//先序遍历
void PreOrder(BiTree T)
{
if (T != NULL)
{
visit(T);//访问根节点,具体访问操作视情况而定,比如cout<<T->data<<endl;
PreOrder(T->lchild);//递归遍历左子树
PreOrder(T->rchlid);//递归遍历右子树
}
}
//中序遍历
void InOrder(BiTree T)
{
if (T != NULL)
{
InOrder(T->lchild);//递归遍历左子树
visit(T);//访问根节点,具体访问操作视情况而定
InOrder(T->rchlid);//递归遍历右子树
}
}
//后序遍历
void PostOrder(BiTree T)
{
if (T != NULL)
{
PostOrder(T->lchild);//递归遍历左子树
PostOrder(T->rchlid);//递归遍历右子树
visit(T);//访问根节点,具体访问操作视情况而定
}
}
中序遍历非递归:
//中序遍历非递归
void InOrder2(BiTree T)
{
InitStack(S);//初始化栈
BiTree p = T;//p是遍历指针
while (p || !IsEmpty(S))//p不空或栈不空时循环
{
if (p)//根指针进栈,遍历左子树
{
Push(S, p);
p = p->lchild;//每遇到非空二叉树先向左走
}
else
{
Pop(S, p);//根指针退栈,访问根节点,遍历右子树
visit(p);
p = p->rchlid;//
}
}
}
层次遍历
//层次遍历
typedef struct
{
BTNode data[MaxSize];//存放队中元素
int front, rear;//队头和队尾指针
}SqQueue;//顺序循环队列类型
void LevelOrder(BiNode *b)
{
BTNode* p;
SqQueue* qu;
InitQueue(qu);//初始化队列
enQueue(qu, b);//根节点指针进入队列
while (!QueueEmpty(qu))//队列不空,则循环
{
deQueue(qu, p);//出队节点p
visit(p);//访问节点p
if (p->lchlid != NULL)//有左孩子将其入队
enQueue(qu, p->lchild);
if (p->rchlid != NULL)//有右孩子将其入队
enQueue(qu, p->rchild);
}
}
先序遍历建立二叉树链表
由于不唯一,填充空节点:
Status CreateBiTree(BiTree& T)
{
cin >> ch;
if (ch == "#")//如果为空字符,就构造空树
T = NULL;
else
{
if (!(T = new BiTree))//申请空间不成功就退出
exit(OVERFLOW);
T->data = ch;//生成根节点
CreateBiTree(T->lchild);//构造左子树
CreateBiTree(T->rchlid);//构造右子树
}
return OK;
}
复制二叉树
//复制二叉树
int Copy(BiTree T, BiTree& NewT)
{
if (T == NULL)
{
NewT = NULL;
return 0;
}
else
{
NewT = new BiTNode;
NewT->data = T->data;
Copy(T->lchild, NewT->lchild);
Copy(T->rchlid, NewT->rchlid);
}
}
计算二叉树深度
//计算二叉树深度
int Depth(BiTree T)
{
if (T == NULL)
return 0;
else
{
int m = Depth(T->lchild);
int n = Depth(T->rchlid);
if (m > n)
return m + 1;
else
return n + 1;
}
}
计算二叉树节点总个数
//计算二叉树节点总个数
int NodeCount(BiTree T)
{
if (T == NULL)
return 0;
else
return NodeCount(T->lchild) + NodeCount(T->rchlid) + 1;
}
二叉树叶子节点数
//二叉树叶子节点数
int LeafCount(BiTree T)
{
if (T == NULL)//如果是空树返回0
return 0;
if (T->lchild == NULL && T->rchlid == NULL)
return 1;//如果是叶子结点返回1
else
return LeafCount(T->lchild) + LeafCount(T->rchlid);
}
线索二叉树