建立树结构
typedef struct TreeNode *BinTree;
struct TreeNode{
int data;
BinTree left;
BinTree right;
};
一、先序遍历
(1)访问根节点
(2)先序遍历左子树
(3)先序遍历右子树
先序遍历二叉树的递归算法在二叉链表上的实现:
void PreOrderTraversal(BinTree BT)
{
if(BT)
{
cout<<BT->data;
PreOrderTraversal(BT->left);
PreOrderTraversal(BT->right);
}
}
二、中序遍历
(1) 中序遍历左子树;
(2) 访问根结点;
(3) 中序遍历右子树。
中序遍历二叉树的递归算法在二叉链表上的实现:
void InOrderTraversal(BinTree BT)
{
if(BT)
{
InOrderTraversal(BT->left);
cout<<BT->data;
InOrderTraversal(BT->right);
}
}
三、后序遍历
(1) 后序遍历左子树;
(2) 后序遍历右子树;
(3) 访问根结点。
后序遍历二叉树的递归算法在二叉链表上的实现:
void PostOrderTraversal(BinTree BT)
{
if(BT)
{
PostOrderTraversal(BT->left);
PostOrderTraversal(BT->right);
cout<<BT->data;
}
}
四、非递归算法(以中序遍历为例)
-
遇到一个结点,就把它压栈,并去遍历它的左子树;
-
当左子树遍历结束后,从栈顶弹出这个结点并访问它;
-
然后按其右指针再去中序遍历该结点的右子树。
中序遍历的非递归算法实现
void InOrder(BinTree BT)
{
BinTree T=BT;
stack<BinTree>s;
while(T||!s.empty())
{
while(T)
{
s.push(T);
T=T->left;
}
if(!s.empty())
{
T=s.top();
s.pop();
cout<<T->data;
T=T->right;
}
}
}
五、层序遍历
设置一个队列结构,遍历从根结点开始,首先将根结点指针入队,然
后开始执行下面三个操作:
1.从队列中取出一个元素;
2.访问该元素所指结点;
3.若该元素所指结点的左、右孩子结点非空,则将其左、右孩子的指针顺序入队。
层序遍历的代码实现
void LevelOrder(BinTree BT)
{
if(!BT) return;
BinTree T;
queue<BinTree>q;
q.push(BT);
while(!q.empty())
{
T=q.front();
q.pop();
cout<<T->data;
if(T->left) q.push(T->left);
if(T->right) q.push(T->right);
}
}
六、附STL中栈和队列的常用函数
栈
头文件:#include < stack >
创建空栈:stack< int > s;
元素入栈:s.push(x);
元素出栈:s.pop();
取栈顶元素:s.top();
判断非空:s.empty();
队列
头文件:#include< queue >
创建空队列:queue< int > q;
元素入队:q.push(x);
元素出队:q.pop();
取队首元素:q.front();
取队尾元素:q.back();
判断非空:q.empty();