< 今日知识点 >
- 二叉树及存储结构
- 二叉树的遍历
·
·
·
—01 二叉树及存储结构
1、二叉树的几个重要性质
·
2、二叉树的存储结构
- 完全二叉树使用顺序存储方式在查找上是十分方便的,任意一个儿子节点想要寻找它的父节点,只需用儿子节点的下标÷2 取整即可。
- 一般的二叉树也可以使用顺序存储方式存储节点,但是若想要方便查找,就需要空出空的节点位置,造成空间浪费。
代码实现:
typedef struct TreeNode *BinTree;
typedef BinTree Position;
struct TreeNode{
ElementType Data;
BinTree left;
BinTree right;
};
·
·
·
—02 二叉树的遍历
1、二叉树的递归遍历
以前序遍历为例:
- 访问根节点
- 先序遍历其左子树
- 先序遍历其右子树
先序遍历代码实现:
void PreOrderTraversal(BinTree T)
{
if(BT){
printf("%d",BT->Data);
PreOrderTraversal(BT->left);
PreOrderTraversal(BT->right);
}
}
中序遍历代码实现:
void InOrderTraversal(BinTree T)
{
if(BT){
InOrderTraversal(BT->left);
printf("%d",BT->Data);
InOrderTraversal(BT->right);
}
}
后序遍历代码实现:
void PostOrderTraversal(BinTree BT)
{
if(BT){
PostOrderTraversal(BT->left);
PostOrderTraversal(BT->right);
printf("%d",BT->Data);
}
}
- 先序、中序、后序遍历过程:遍历过程中经过节点的路线一样,只是访问各节点的时机不同。先序遍历是第一次遇到该节点时访问,中序是第二次遇到该节点时访问,而后序是第三次。
·
2、二叉树的非递归遍历
(1)先序遍历
void preorder(bitree *t)//前序遍历的非递归算法
{
bitree *temp = t;//定义一个树节点,用它来遍历
while(temp != NULL || s.top != 0)
{
while(temp != NULL)//先遍历左孩子,并输出。
{
printf("%4d",temp->data);
push(temp);
temp = temp->lchild;
}
if(s.top != 0)//当左孩子遍历完后,取栈顶,找右孩子。此时循环还没有结束,再遍历它的左孩子,直至孩子全部遍历结束。
{
temp = pop();
temp = temp->rchild;
}
}
printf("\n");
}
(2)中序遍历
void inorder(bitree *t)//中序遍历的非递归算法
{
bitree *temp = t;
while(temp != NULL||s.top != 0)
{
while(temp != NULL)//先把左孩子入栈,所有左孩子入栈结束
{
push(temp);
temp = temp->lchild;
}
if(s.top != 0)//左孩子入栈结束,取栈顶,输出栈顶元素,遍历右孩子
{
temp = pop();
printf("%4d",temp->data);
temp = temp->rchild;
}
}
printf("\n");
}
(3)后序遍历
void laorder (BinTree T)
{
BinTree temp = T;
while (temp != NULL || s.top != NULL)
{
temp->number=1; //当前节点首次被访问
push(temp);
temp = temp->Left;
}
if(s.top != NULL)
{
temp=pop(); //栈顶出栈
if(temp->number == 1) //第一次出现在栈顶
{
temp->number++;
push(temp); //重新入栈
temp=temp->Right; //指向右子树
} else if(temp->number ==2){
printf("%4d",temp->Data);
temp = NULL; //置空,防止陷入死循环
}
}
}
}
(4)层序遍历
void LevelOrderTraversal(BinTree BT)
{
Queue Q;
BinTree T;
if(!BT) return; //若是空树则直接返回
Q = CreateQueue();
AddQ(Q,BT);
while(!IsEmpty(Q))
{
T = DeleteQ(Q);
printf("%d",T->Data); //访问出队节点
if(T->Left)
AddQ(Q,T->Left);
if(T->Right)
AddQ(Q,T->Right);
}
}
·
·
·
·
·
·
附:文章中所有ppt图片均来自 中国大学mooc 浙江大学《数据结构》课程!!