題目來源: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 *¤t, 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;
}