leetcode二叉树的四种遍历(迭代)及构造(C语言)


前言

遍历二叉树(非递归)需要每个结点输出一次,而每个元素只进栈或出栈一次,因此写代码的时候可以将输出与进栈或出栈一起考虑。
实现算法时只考虑树的结点如何按顺序进栈出栈。


一、二叉树中序遍历非递归方法

1.1设计思路

  1. 依次将p左子树入栈,直至p为空指针(初始p指向根节点)
  2. 将结点出栈,输出其值,另p指向其右结点,继续重复1

1.2代码

//代码前半部分为参数声明,while为中序遍历实现
int* inorderTraversal(struct TreeNode* root, int* returnSize){
    *returnSize=0;
    if(root==NULL)
        return NULL;
    int* ans=(int*)malloc(sizeof(int)*100);
    struct TreeNode** stk=(struct TreeNode**)malloc(sizeof(struct TreeNode*)*100);
    int top=-1,i=0;
    struct TreeNode* p=root;//p为遍历指针

    while(p!=NULL || top>-1){
        if(p!=NULL){
            stk[++top]=p;//左节点入栈
            p=p->left;
        }
        else{
            ans[i++]=stk[top]->val;//返回左节点值
            *returnSize=i;
            p=stk[top--]->right;//转到右节点重复以上步骤
        }
    }

    return ans;
}
  • 时间复杂度O( n )
  • 空间复杂度O( n )

二、前序遍历方法

2.1设计思路

  1. 依次将p左子树入栈,入栈前输出p结点值,直至p为空
  2. 将结点出栈,输出其值,另p指向其右结点,继续
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值