二叉树及先序,中序,后序遍历

1、什么是二叉树算法

每一个结点至多只有两棵子树,而且,二叉树有左右之分不能随便颠倒位置。spa

2、二叉树的存储形式指针

一、顺序存储结构code

用一组地址连续的存储单元以此自上而下、自左从右的存储二叉树的结点元素。这种结构便于遍历二叉树查找元素,可是会浪费大量内存空间。blog

二、链式存储结构递归

每一个结点有指向左右子树的指针,自己的数据内容,还能够加上指向双亲的指针。这样相对于顺序存储结构可以节省内存空间。内存

3、二叉树结构体class

typedef struct Node{
    int data;
    Node *lchild;
    Node *rchild;
}Node;

 

4、先序遍历二叉树

一、先访问根节点循环

二、先序遍历左子树

三、先序遍历右子树

代码(递归):

void BL(tree* T){
printf("%d",T->data);
if(T->lchild!=NULL) BL(T->lchild); if(T->rchild!=NULL) BL(T->rchild); }

5、中序遍历

一、中序遍历左子树

二、访问根节点

三、中序遍历右子树

代码(递归):

void BL(tree* T)
{
if(T->lchild!=NULL)
BL(T->lchild);
printf("%d",T->data);
if(T->rchild!=NULL) BL(T->rchild); }

6、后序遍历

一、后序遍历左子树

二、后序遍历右子树

三、访问根节点

代码(递归):

void BL(tree* T)
{
if(T->lchild!=NULL)
BL(T->lchild);
if(T->rchild!=NULL)
BL(T->rchild);
printf("%d",T->data);
}

7、例子

 

上图的先序:-+a*b-cd/ef

中序:a+b*c-d-e/f

后序:abcd-*+ef/-

 对于三种遍历,能够这样去想,就比较容易理解了,从根开始一直往左子树遍历,到底后,而后退回一个点,遍历右子树的全部左子树,如此循环,若是是先序,就在第一次访问节点的时候进行处理,若是是中序就是第二次访问节点的时候处理,若是是后序就第三次访问的时候进行处理。只要记住结点的三次访问分别是干什么的,就能够很好的理解三次遍历过程,只有熟练掌握了三种遍历,才能用算法去实现树的各类操做。

相关文章
相关标签/搜索