1.二叉树的遍历算法
1.1三种遍历示例
先序遍历:ABCDEFGH
中序遍历:CBEDFAHG
后续遍历:CEFDBHGA
可以用如下方式进行遍历:假定有个指针p沿着图中蓝色箭头游历整个二叉树。标号1表示第一次经过节点,2表示第二次经过节点,3表示第三次经过节点,分别对应了前序遍历(1)、中序遍历(2)、后序遍历(3)的结果:
1.2二叉树的存储结构:
struct BTNode {
int val;
TreeNode *lchild;
TreeNode *rchild;
};
1.3先序遍历
void preorder(BTNode *p){
if(p!=null){
Visit(p);//可以是打印
preorder(p->lchild);//先序遍历左子树
preorder(p->lchild);//先序遍历右子树
}
}
1.4中序遍历
void inorder(BTNode *p){
if(p!=null){
preorder(p->lchild);
Visit(p);
preorder(p->lchild);
}
}
1.5后序遍历
void postorder(BTNode *p){
if(p!=null){
preorder(p->lchild);
preorder(p->lchild);
Visit(p);
}
}
2.层次遍历
要进行层次遍历,需要创建一个循环队列。先将二叉树头节点入队列,然后出队列,访问该节点,如果它有左子树,左子树入队;如果它有右子树,右子树入队。然后出队,对出队节点访问,如此反复,直到队列为空为止。
void level(BTNode *p){
int front=0,rear=0;
BTNode *que[maxSize];
BTNode *p;
if(p!=Null){
rear=(rear+1)%maxSize;
que[rear]=p;//根节点入队
while(front!=rear){//队列非空
front=(front+1)%maxSize;
q=que[front];//队头出队
Visit(q);//访问队头
if(q->lchild!=Null){//左子树非空
rear=(rear+1)%maxSize;//左子树入队
que[rear]=q->lchild;
}
if(q->rchild!=Null){//右子树非空
rear=(rear+1)%maxSize;//右子树入队
que[rear]=q->rchild;
}
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。