二叉树简单遍历(先序,中序,后序,层次遍历)
先序遍历的实现思想是:
- 访问根节点;
- 访问当前节点的左子树;
- 若当前节点无左子树,则访问当前节点的右子树;
中序遍历的实现思想是:
- 访问当前节点的左子树;
- 访问根节点;
- 访问当前节点的右子树;
后序遍历的实现思想是:
从根节点出发,依次遍历各节点的左右子树,直到当前节点左右子树遍历完成后,才访问该节点元素。
层次遍历:
通过使用队列的数据结构,从树的根结点开始,依次将其左孩子和右孩子入队。而后每次队列中一个结点出队,都将其左孩子和右孩子入队,直到树中所有结点都出队,出队结点的先后顺序就是层次遍历的最终结果。
#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; }