二叉树简单遍历(先序,中序,后序,层次遍历)

先序遍历的实现思想是:

  1. 访问根节点;
  2. 访问当前节点的左子树;
  3. 若当前节点无左子树,则访问当前节点的右子树;

中序遍历的实现思想是:

  1. 访问当前节点的左子树;
  2. 访问根节点;
  3. 访问当前节点的右子树;

后序遍历的实现思想是:

从根节点出发,依次遍历各节点的左右子,直到当前节点左右子树遍历完成后,才访问该节点元素。

 

层次遍历:

通过使用队列的数据结构,从树的根结点开始,依次将其左孩子和右孩子入队。而后每次队列中一个结点出队,都将其左孩子和右孩子入队,直到树中所有结点都出队,出队结点的先后顺序就是层次遍历的最终结果。

 

#include <iostream>
#include <queue>

using namespace std;

int front = 0, rear = 0;

struct A {
    int elem;
    struct A* rval, * lval;
};

void CreatBiTree(A *T){
    T->elem = 5;
    T->lval = new A[sizeof(A)];
    T->lval->elem = 4;
    T->rval = new A[sizeof(A)];
    T->rval->elem = 3;
    T->lval->lval = new A[sizeof(A)];
    T->lval->lval->elem = 2;
    T->lval->rval = NULL;
    T->rval->lval = new A[sizeof(A)];
    T->rval->lval->elem = 1;
    T->rval->rval = NULL;
    T->lval->lval->rval = NULL;
    T->lval->lval->lval = NULL;
    T->rval->lval->lval = NULL;
    T->rval->lval->rval = NULL;

}

void Func(A* T) {
    if (T) {
        cout << T->elem << " ";
        Func(T->lval);
        Func(T->rval);
    }
}

void Func1(A* T) {
    if (T) {
        Func1(T->lval);
        cout << T->elem << " ";
        Func1(T->rval);
    }
}

void Func3(A* T) {
    if (T) {
        Func1(T->lval);
        Func1(T->rval);
        cout << T->elem << " ";
    }
}

void LevelOrder(A* t) {
    queue<A*> Q;
    A* temp = t;
    if (temp != NULL)
        Q.push(temp);
    while (!Q.empty()) {
        temp = Q.front();
        cout << temp->elem << " ";
        Q.pop();
        if (temp->lval)
            Q.push(temp->lval);
        if (temp->rval)
            Q.push(temp->rval);
    }
}

int main()
{
    A* a;
    a = new A[sizeof(A)];
    CreatBiTree(a);
    cout << "先序遍历:";
    Func(a);
    cout << endl;
    cout << "中序遍历:";
    Func1(a);
    cout << endl;
    cout << "后序遍历:";
    Func3(a);
    cout << endl;
    cout << "层次遍历:";
    LevelOrder(a);

    system("PAUSE");
    return 0;
}

 

posted @ 2019-03-13 19:40  Hk_Mayfly  阅读(382)  评论(0编辑  收藏  举报