OJ面试题(非递归实现二叉树的中序遍历)

/**

  • Definition for a binary tree node.
  • struct TreeNode {
  • int val;
    
  • struct TreeNode *left;
    
  • struct TreeNode *right;
    
  • };
    /
    /
    *
  • Return an array of size *returnSize.
  • Note: The returned array must be malloced, assume caller calls free().
    /
    typedef int STDataType;
    typedef struct Stack
    {
    STDataType
    _array;
    int _top;//栈顶
    int _capacity;//容量
    }Stack;
    void StackInit(Stack* ps);
    void StackDestory(Stack* ps);
    void StackPush(Stack* ps,STDataType x);
    void StackPop(Stack* ps);
    STDataType StackTop(Stack* ps);
    int StackEmpty(Stack* ps);
    int StackSize(Stack* ps);
    void StackInit(Stack* ps)
    {
    assert(ps);
    ps->_array = NULL;
    ps->_capacity = 0;
    ps->_top = 0;
    }
    void StackDestory(Stack* ps)
    {
    assert(ps);
    free(ps->_array);
    ps->_array = NULL;
    ps->_capacity = 0;
    ps->_top = 0;
    }
    void StackPush(Stack* ps, STDataType x)
    {
    assert(ps);
    if (ps->_top == ps->_capacity)
    {
    size_t newcapacity = ps->_capacity == 0 ? 4 : ps->_capacity * 2;
    ps->_array = (STDataType*)realloc(ps->_array, sizeof(STDataType)newcapacity);
    assert(ps->_array != NULL);
    ps->_capacity = newcapacity;
    }
    //ps->_top = x;
    ps->_array[ps->_top]=x;
    ps->_top++;
    }
    void StackPop(Stack
    ps)
    {
    assert(ps && ps->_top > 0);
    ps->_top–;
    }
    STDataType StackTop(Stack* ps)
    {
    assert(ps);
    return ps->_array[ps->_top-1];//
    }
    int StackEmpty(Stack* ps)
    {
    assert(ps);
    return ps->_top == 0 ? 0 : 1;
    }
    int StackSize(Stack* ps)
    {
    assert(ps);
    return ps->_top;
    }

int* inorderTraversal(struct TreeNode* root, int* returnSize)
{

Stack s;
StackInit(&s);
struct TreeNode* cur=root;
while(StackEmpty(&s)!=0 || cur!=NULL)
{
    while(cur != NULL)
    { 
        StackPush(&s,cur);
        cur=cur->left;
    }
    struct TreeNode* top=StackTop(&s);
    //printf("%d ",top->val);
    ++(*returnSize);//输出一个节点,就记一次数
    StackPop(&s);
    
    cur=top->right;
}
int* prearray=(int*)malloc(4*(*returnSize));
int i=0;
cur=root;
 while(StackEmpty(&s)!=0 || cur!=NULL)
{
    while(cur != NULL)
    {
        StackPush(&s,cur);
        
        cur=cur->left;
    }
     
   struct TreeNode* top=StackTop(&s);
   printf("%d ",top->val);
   prearray[i]=top->val;
        i++;//输出一个节点,就往数组里面放一个
    StackPop(&s);
    
    cur=top->right;
}
return prearray;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include #include //#define error 0 //#define OVERFLOW -1 //#define ok 1 #define MAXSIZE 100 typedef char TElemType; typedef int Status; typedef struct BiTNode{ //树的结点 TElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; typedef BiTree datatype; typedef struct { datatype data[MAXSIZE]; int top; }sqstack; typedef sqstack *STK; Status CreateBiTree(BiTree *T) { //先建立二叉树 char ch; ch=getchar(); if(ch=='#') (*T)=NULL; //#代表空 else { (*T)=(BiTree)malloc(sizeof(BiTNode)); (*T)->data=ch; CreateBiTree(&(*T)->lchild); //先建立左子树 CreateBiTree(&(*T)->rchild); //先建立右子树 } return 1; } STK initstack() //栈的初始化 { STK s; s=(STK)malloc(MAXSIZE*sizeof(sqstack)); s->top=0; return s; //返回指向栈地址的指针 } Status stackempty(STK s) //判断栈是否为空 { return(s->top==0); } Status push(STK s,datatype *e) //压栈函数 { if(s->top==MAXSIZE) //栈满,则返回错误 return 0; else { s->data[s->top]=*e; (s->top)++; return 1; } } Status pop(STK s,datatype *e) //出栈函数 { if(stackempty(s)) //判断栈是否为空 return 0; else { s->top--; *e=s->data[s->top]; //用e接受栈顶元素 return 1; } } Status inordertraverse(BiTree T) //归遍叉树 { STK s; s=initstack(); // BiTree T; BiTree p; p=T; while (p||!stackempty(s)) { if(p) { push(s,&p); p=p->lchild; } else { pop(s,&p); printf("%2c",p->data); p=p->rchild; }//else }//while return 1; }//inordertraverse void main() { BiTree T=NULL; printf("\n Creat a Binary Tree .\n"); //建立一棵二叉树T* CreateBiTree( &T ); printf ("\nThe preorder is:\n"); inordertraverse(T); }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值