二元查找樹轉變成排序的雙向鏈表

題目來源:http://bbs.csdn.net/topics/350118968

1.把二元查找樹轉變成排序的雙向鏈表

輸入一棵二元查找樹,將該二元查找樹轉換成一個排序的雙向鏈表。
要求不能創建任何新的結點,只調整指針的指向。
    
  10
  / \
 6 14
 / \ / \
4 8 12 16
 轉換成雙向鏈表
4=6=8=10=12=14=16。


思路:首先構建一個二叉排序樹,中序遍歷整棵樹。按照這個方式遍歷樹,比較小的結點先訪問。如果我們每訪問一個結點,假設之前訪問過的結點已經調整成一個排序雙向鏈表,我們再把調整當前結點的指針將其鏈接到鏈表的末尾。當所有結點都訪問過之後,整棵樹也就轉換成一個排序雙向鏈表了。

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
struct TreeNode
{
    int nValue;
    TreeNode *left;
    TreeNode *right;
};
typedef TreeNode DoubleList;
DoubleList * pHead = NULL;
DoubleList * pListIndex = NULL;

//建立二叉排序樹
void addTreeNode(TreeNode *&current, int value)
{
    if(current == NULL)
    {
        TreeNode *tree = new TreeNode();
        tree->left = NULL;
        tree->right = NULL;
        tree->nValue = value;
        current = tree;
    }
    else
    {
        if((current->nValue) > value)
            addTreeNode(current->left, value);
        else if((current->nValue) < value)
            addTreeNode(current->right, value);
        else
            cout << "重複節點" << endl;
    }
}
//修改二叉樹的指針指向
void changeList(TreeNode *current)
{
    current->left = pListIndex;
    if(NULL != pListIndex)
        pListIndex->right = current;
    else
        pHead = current;
    pListIndex = current;
    cout << current->nValue << endl;
}
//中序遍歷
void travel(TreeNode *head)
{
    if(head == NULL)
        return;
    if(head->left != NULL)
        travel(head->left);
    changeList(head);
    if(head->right != NULL)
        travel(head->right);
}
int main()
{
    TreeNode *Root = NULL;
    int t;
    addTreeNode(Root, 10);
    addTreeNode(Root, 4);
    addTreeNode(Root, 6);
    addTreeNode(Root, 8);
    addTreeNode(Root, 12);
    addTreeNode(Root, 14);
    addTreeNode(Root, 15);
    addTreeNode(Root, 16);
    travel(Root);
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章