赞
踩
查找(Searching):根据某个给定关键字K,从集合R中找出关键字与K相同的记录
静态查找:集合中记录是固定的
- 没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的
- 除查找,还可能发生插入和删除
顺序查找:O(n) 二分查找:O(logn)
- 假设n个数据元素的关键字满足有序(比如:小→大)k1<k2<…<kn,并且是连续存放(数组),那么可以进行二分查找
树(Tree):n(n≥0)个结点构成的有限集合,当n=0时称为空树。
对于任一颗非空树(n>0),它具备以下性质:
二叉树T:一个有穷的结点集合。这个集合可以为空;若不为空,则它是由根节点和称为其左子树 T L T_L TL和右子树 T R T_R TR的两个不相交的二叉树组成。
二叉树的具体5种形态:
二叉树的子树有左右顺序之分:
Boolean IsEmpty(BinTree BT)
:判别BT是否为空void Traversal(BinTree BT)
:遍历,按某顺序访问每个结点BinTree CreatBinTree()
:创建一个二叉树二叉树常用的遍历方法:
void PreOrderTraversal(BinTree BT)
:先序——根、左子树、右子树void InOrderTraversal(BinTree BT)
:中序——左子树、根、右子树void PostOrderTraversal(BinTree BT)
:后序——左子树、右子树、根void LevelOrderTraversal(BinTree BT)
:层次遍历——从上到下、从左到右
typedef struct TreeNode *BinTree;
typedef BinTree Positioon;
struct TreeNode{
ElementType Data;
BinTree Left;
BinTree Right;
}
遍历过程为:
采用递归实现
void PreOrderTraversal(BinTree BT)
{
if(BT)
{
printf("%d",BT->Data);
PreOrderTraversal(BT->Left);
PreOrderTraversal(BT->Right);
}
}
A(BDFE)(CGHI)
遍历过程为:
void InOrderTraversal(BinTree BT)
{
if(BT)
{
InOrderTraversal(BT->Left);
printf("%d",BT->Data);
InOrderTraversal(BT->Right);
}
}
遍历过程为:
void PostOrderTraversal(BinTree BT)
{
if(BT)
{
PostOrderTraversal(BT->Left);
PostOrderTraversal(BT->Right);
print("%d",BT->Data);
}
}
(DEFB)(HGCI)A
前序、中序和后序遍历过程:遍历过程中经过结点的路线一样,只是访问各结点的时机不同。
非递归算法实现的基本思路:使用堆栈
中序遍历非递归遍历算法:
void InOrderTraversal(BinTree BT) { BinTree T = BT; Stack S = CreatStack(MaxSize); /* 创建并初始化堆栈s */ while(T || !IsEmpty(S)) { while(T) /* 一直向左并将沿途结点压入堆栈 */ { Push(S,T); T = T->Left; } if(!IsEmpty(S)) { T = Pop(S); /* 结点弹出堆栈 */ printf("%5d",T->Data); /* (访问)打印结点 */ T = T->Right; /* 转向右子树 */ } } }
先序遍历非递归遍历算法:
void InOrderTraversal(BinTree BT) { BinTree T = BT; Stack S = CreatStack(MaxSize); /* 创建并初始化堆栈s */ while(T || !IsEmpty(S)) { while(T) /* 一直向左并将沿途结点压入堆栈 */ { printf("%5d",T->Data); /* (访问)打印结点 */ Push(S,T); T = T->Left; } if(!IsEmpty(S)) { T = Pop(S); /* 结点弹出堆栈 */ T = T->Right; /* 转向右子树 */ } } }
二叉树遍历的核心问题:二维结构的线性化
遍历从根节点开始,首先将根结点入队,然后开始执行循环:结点出队、访问该结点、其左右儿子入队
ABCDFGIEH
层序基本过程:先根节点入队,然后:
void LevelOrderTraversal(BinTree BT) { Queue Q; BinTree T; if(!BT) return; /* 若是空树,则直接返回 */ Q = CreatQueue(MaxSize); /* 创建并初始化队列Q */ AddQ(Q,BT); while(!IsEmptyQ(Q)) { T = DeleteQ(Q); printf("%d\n",T->Data); /* 访问取出队列的结点 */ if(T->Left) AddQ(Q,T->Left); if(T->Right) AddQ(Q,T->Right); } }
通过改造后序遍历
先序和中序遍历序列来确定一棵二叉树:
分析:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。