一、先序遍历(非递归)
1.编程思路:
二叉树的非递归先序遍历相对与对栈 的一波操作:先判断根节点是否为空,若为空直接返回,不为空将进入以下判断,将根节点入栈,进入循环体;取栈顶元素,进行访问并对栈做出栈操作;(访问包括先将其右孩子入栈,再将其左孩子入栈,如孩子为空,则不进行入栈操作),以此方法进行循环,直至栈内无元素结束。
原二叉树图:
思维图如下所示:
2.程序代码实现:
//非递归的先序遍历二叉树
void PreOrderByLoop(TreeNode* root){
if(root == NULL){
//空树
return;
}
//入栈
SeqStack q;
SeqStackInit(&q);
SeqStackPush(&q,root);
TreeNode value;
while(GetStackTop(&q,&value)){
printf("%c ",value.data);
SeqStackPop(&q);
if(value.rchild != NULL){
//入栈
SeqStackPush(&q,value.rchild);
}
if(value.lchild != NULL){
//入栈
SeqStackPush(&q,value.lchild);
}
}
printf("\n");
return;}
3.代码检测:
void textPreOrderByLoop(){
printf("\n*************%s********************\n",__FUNCTION__);
TreeNode* A = CreatTreeNode('a');
TreeNode* B = CreatTreeNode('b');
TreeNode* C = CreatTreeNode('c');
TreeNode* D = CreatTreeNode('d');
A->lchild = B;
A->rchild = C;
B->lchild = D;
PreOrderByLoop(A);
}
结果显示:
二、中序遍历(非递归)
1.编程思路
先进行判断根节点是否为空,为空直接返回,不为空则入栈并进行以下判断:取栈顶元素,对其左子树进行判断,如果其左子树不为空,将其左子树入栈并进行循环判断,知道其左子树为空,对该栈顶元素进行访问并出栈(访问包括打印,与对其右子树的判断,若其有子树不为空,将其入栈再继续,否则直接继续进行取栈顶元素操作,进行循环)。
思维图如下所示:
2.代码实现
//非递归的中许遍历二叉树
void InOrderByLoop(TreeNode* root){
if(root == NULL){
//空树
return;
}
//入栈
SeqStack q;
SeqStackInit(&q);
SeqStackPush(&q,root);
TreeNode* cur = root->lchild;
while(1){
while(cur != NULL){
SeqStackPush(&q,cur);
cur = cur->lchild;
}
TreeNode value;
if(GetStackTop(&q,&value)){
printf("%c ",value.data);
cur =value.rchild;
SeqStackPop(&q);
}else{
printf("\n");
return;
}
}
return;
}
3.代码检测
void textInOrderByLoop(){
printf("\n*************%s********************\n",__FUNCTION__);
TreeNode* A = CreatTreeNode('a');
TreeNode* B = CreatTreeNode('b');
TreeNode* C = CreatTreeNode('c');
TreeNode* D = CreatTreeNode('d');
A->lchild = B;
A->rchild = C;
B->lchild = D;
InOrderByLoop(A);
}
结果显示:
三、后序遍历(非递归)
1.编程思路
先进行判断根节点是否为空,为空直接返回,不为空则入栈并进行以下判断:取栈顶元素,对其左子树进行判断,如果其左子树不为空,将其左子树入栈并进行循环判断,知道其左子树为空,对该栈顶元素进行访问并出栈(对其右子树的判断,若其有子树不为空,(此时将其右孩子与保存值进行比较,相等则打印、出栈,否则将其右孩子入栈再继续进行右孩子的左子树判断循环体,)为空则进行打印、出栈并保存,继续进行取栈顶元素操作,进行循环,直至栈为空。
思维图如下所示:
2.代码实现
//非递归的后序遍历二叉树
void PostOrderByLoop(TreeNode* root){
if(root==NULL){
//空树
return;
}
//入栈
SeqStack q;
SeqStackInit(&q);
SeqStackPush(&q,root);
TreeNode* cur = root->lchild;
while(1){
while(cur != NULL){
SeqStackPush(&q,cur);
cur = cur->lchild;
}
TreeNode value;
TreeNode pre;
if(GetStackTop(&q,&value)){
while(value.rchild ==NULL||(value.rchild)->data == pre.data){
printf("%c ",value.data);
pre = value;
SeqStackPop(&q);
if(GetStackTop(&q,&value)==0){
printf("\n");
return;
}
}
cur = value.rchild;
}else{
printf("\n");
return;
}
}
}
3.代码检测
void textPostOrderByLoop(){
printf("\n*************%s********************\n",__FUNCTION__);
TreeNode* A = CreatTreeNode('a');
TreeNode* B = CreatTreeNode('b');
TreeNode* C = CreatTreeNode('c');
TreeNode* D = CreatTreeNode('d');
A->lchild = B;
A->rchild = C;
B->lchild = D;
PostOrderByLoop(A);
}
结果显示: