二叉排序树转化成双向链表


二叉排序树

将二叉排序树转化成双向链表,不创建新的节点。


下面是非递归的算法。

BiNode* BSTtoList(BiNode *T)
{
    BiNode *p, *q;
    BiNode *stack[50];
    int top = 0;
    if (! T) return NULL;

    p = T;
    q = NULL;
    while (top > 0 || p) {
        while (p) {           //一直走到最左
            stack[top++] = p;
            p = p->lchild;   
        }
        if (top > 0) {
            p = stack[--top];
            if (q != NULL) {
                q->rchild = p; //rchild域指向节点的直接后继
                p->lchild = q; //lchild域指向节点的直接前驱
            } else {
                T = q = p; // the first node
            }
            q = p;
            p = p->rchild;
        }// if (top)
    } //while
    q->rchild = T; //最后一个节点的rchild指向T
    return T;
}

测试代码如下:

#include <stdio.h>
#include <stdlib.h>
#include "../headfiles/BiNode.h"
#include "../sharedSource/BinarySortTree.c"

BiNode* BSTtoList(BiNode *T);
void tranverseBSTtoList(BiNode *T);
int main(void)
{

    BiNode *T = NULL;
    int ret, key;
    printf("input the value of nodes(Ctrl-D to terminate): \n");
    while (scanf("%d", &key) != EOF) {
        ret = insertBST(&T, key);
        if (ret == 0)
            printf("insert failed1!\n");
    }
    printf("tranverse the double linked list:\n");
    T = BSTtoList(T);
    tranverseBSTtoList(T);

    return 0;
}

输出:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值