1.二叉树的遍历算法
1.1三种遍历示例
image.png
先序遍历:ABCDEFGH
中序遍历:CBEDFAHG
后续遍历:CEFDBHGA

可以用如下方式进行遍历:假定有个指针p沿着图中蓝色箭头游历整个二叉树。标号1表示第一次经过节点,2表示第二次经过节点,3表示第三次经过节点,分别对应了前序遍历(1)、中序遍历(2)、后序遍历(3)的结果:

image.png
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.层次遍历
image.png
要进行层次遍历,需要创建一个循环队列。先将二叉树头节点入队列,然后出队列,访问该节点,如果它有左子树,左子树入队;如果它有右子树,右子树入队。然后出队,对出队节点访问,如此反复,直到队列为空为止。

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;
            }
        }
    }
}

ch123
60 声望7 粉丝

积土而为山,积水而为海。


引用和评论

0 条评论