1. 程式人生 > >二叉排序樹轉變成排序的雙向連結串列

二叉排序樹轉變成排序的雙向連結串列

一、問題描述

輸入一棵二叉查詢樹,將該二叉查詢樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只調整指標的指向。

【舉例】

     10
    /   \
  6     14
 /  \     /  \
4   8 12 16
 轉換成雙向連結串列
4=6=8=10=12=14=16

二、解題思路

題目要求不能建立任何新的結點,只需要調整指標的指向,那麼就意味著可直接利用二叉樹的結點,通過變更結點的左右孩子的指向,來生成雙鏈表的邏輯關係。問題就變成了:

找當前root結點的左孩子最大的結點left_max,和找當前root結點的右孩子最大的結點right_max然後變更各自的指向,依次遞迴,然後變更指標指向關係:
left_max->rchild   = root  -  root->lchild = left_max
right_max->lchild = root  -  root->rchild = right_max

三、解題演算法

/******************************************
author:tmw
date:2018-10-25
******************************************/
#include <stdio.h>
#include <stdlib.h>

typedef struct BiTreeNode
{
    int data;
    struct BiTreeNode* lchild;
    struct BiTreeNode* rchild;
}BiTreeNode;

BiTreeNode* Tree2Dlink(BiTreeNode* root)
{
    if(root == NULL) return NULL;

    BiTreeNode* leftMax = root->lchild;
    BiTreeNode* rightMin = root->rchild;

    /**找到當前root結點排序後的前後兩個元素**/
    while(leftMax!=NULL && leftMax->rchild!=NULL)
        leftMax = leftMax->rchild;
    while(rightMin!=NULL && rightMin->lchild!=NULL)
        rightMin = rightMin->lchild;

    /**分別對左右子樹做遞迴**/
    Tree2Dlink(root->lchild);
    Tree2Dlink(root->rchild);

    /**變更指向,注意考慮空節點的情況**/
    if(leftMax!=NULL)
        leftMax->rchild = root;
    if(rightMin!=NULL)
        rightMin->lchild = root;
    root->lchild = leftMax;
    root->rchild = rightMin;

    return root;
}

                                                           夢想還是要有的,萬一實現了呢~~~~~~~~ヾ(◍°∇°◍)ノ゙~~~~~