二叉树的前序和中序遍历 非递归实现

前序非递归遍历

记录下学习二叉树的过程,对二叉树遍历的递归写法不太理解,因此使用非递归写法,模拟递归过程,加深理解对递归过程理解。(学完发现,还是递归香)

#include<bits/stdc++.h>

using namespace std;
//定义一棵树
typedef struct T{
    int val;
    struct T *lNode;
    struct T *rNode;
}T;

//初始化根节点
T* initT(T *root,int val){
    root = (T*)malloc(sizeof(T));
    root->val = val;
    root->rNode = NULL;
    root->lNode=NULL;
    return root;
}

//构造一颗二叉排序树,递归写法
T *BSTRec_Insert(T *root,int val){
    if(!root)
    {
         root = (T*)malloc(sizeof(T));
         root->val = val;
         root->lNode = NULL;
         root->rNode = NULL;
    }
    else
    {
        if(val > root->val)
        {
            root->rNode = BSTRec_Insert(root->rNode,val);
        }else if(val < root->val){
            root->lNode = BSTRec_Insert(root->lNode,val);
        }
    }
    return root;
}

//前序递归遍历,用于比较非递归写法是否正确
void preOrder(T* root){
    if(root){
        printf("%3d",root->val);
        preOrder(root->lNode);
        preOrder(root->rNode);
    }
}

//前序非递归
void preOrderNotRec(T* root){
    stack<T*> treeNodes;

	//当 节点不为空 或 栈不为空(说明栈中还有未遍历子树) 
    while(root || !treeNodes.empty()) {
    	//根节点向左移动,直到左子树为空
        while (root) {
            printf("%3d", root->val);
            treeNodes.push(root);
            root = root->lNode;
        }

		//左子树为空,就弹出栈顶元素
        T *curNode = treeNodes.top();
        treeNodes.pop();
        
        //右子树不为空,让当前根移动到右子树
        if (curNode->rNode) {
            root = curNode->rNode;
        }
    }
}

int main(){
    T *root = NULL;
    root = initT(root,4);
    BSTRec_Insert(root,3);
    BSTRec_Insert(root,5);
    BSTRec_Insert(root,2);
    BSTRec_Insert(root,6);
	
	
    preOrderNotRec(root);
    printf("\n");
    preOrder(root);
}

在这里插入图片描述

中序非递归(可自行测试)

/*
 中序非递归
        基本思路:
        1.建立一个栈
        2.根节点入栈,遍历左子树
        3.根节点出栈,输出根节点,遍历右子树
 */
void InfixOrderNotRec(T* root){
    stack<T*> treeNodes;

//    根节点入栈,遍历左子树,直到左子树为空
    while(!treeNodes.empty() || root){
        while (root){
            treeNodes.push(root);
            root = root->lNode;
        }
        T* curNode = treeNodes.top();

//        遍历根结点
        printf("This current node = %d\n", curNode->val);

//        栈顶元素出栈
        treeNodes.pop();

//        遍历右子树
        if (curNode->rNode != NULL) {
            root = curNode->rNode;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值