不用栈的二叉树中序遍历

不用栈的二叉树中序遍历

// 中序遍历非栈非递归
void inOrder_noRecursion_noStack(TreeNode* r, char* pattern)
{
    TreeNode* current = r;
    while(current)
    {
        if(current->lchild == NULL)
        {
            // 当前节点没有左孩子,所以是应该访问的结点
            printf(pattern, current->value);
            current = current->rchild;
        }
        else
        {
            TreeNode* past = current->lchild;
            // past一直到最右下
            while(past->rchild != NULL && past->rchild != current)
                past = past->rchild;

            if(past->rchild == NULL)
            {
                // 此时current是past的后继结点,建立链接方便下次找到后继节点
                past->rchild = current;
                current = current->lchild;
            }
            else
            {
                /*
                此时past的右孩子指向后继节点,所以是第二次访问
                代表当前结点的左子树已经访问完毕,所以访问当前结点
                然后把指针移到后继或者右子树,并消除多余链接
                */
                printf(pattern, current->value);
                past->rchild = NULL;
                current = current->rchild;
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值