<span style="font-size:18px;">二叉搜索树转换成对应的双向链表,不能生成新的节点,只允许改变节点的的指针。</span>
<span style="font-size:18px;">解题思路:</span>
<span style="font-size:18px;">由于按照中序遍历方法遍历二叉搜索树得到的结果是有序的,因此可以按照中序遍历方法遍历搜索树。定义函数BinaryTreeNode* Transfer(BinaryTreeNode* root),该函数将以节点root为根节点的二叉树转换为对应的有序双向链表,并返回该双向链表的头节点指针。具体代码如下:<img src="https://img-blog.csdn.net/20160831215418737?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><img src="https://img-blog.csdn.net/20160831215418737?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></span>
// ConsoleApplication7.cpp : 定义控制台应用程序的入口点。
//二叉搜索树转双向链表
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
struct BinaryTreeNode{
int mvalue;
struct BinaryTreeNode *p_left;
struct BinaryTreeNode *p_right;
};
void printTree(BinaryTreeNode *root);
void InsertNode(BinaryTreeNode **root,BinaryTreeNode *node){
//cout << root;
if (*root==NULL){
*root = node;
}
else{
BinaryTreeNode *q,*p=NULL;
q = *root;
while (q){
if (q->mvalue < node->mvalue){
p = q;
q = q->p_right;
}
else{
p = q;
q = q->p_left;
}
}
if (p->mvalue > node->mvalue){
p->p_left = node;
}
else if(p->mvalue<node->mvalue){
p->p_right = node;
}
}
};
BinaryTreeNode* Transfer(BinaryTreeNode* root){
BinaryTreeNode *p, *q,*r,*m,*n;
p = root->p_left;
q = root->p_right;
if (root){
if (!p && !q){
return root;
}
r = Transfer(p);
m = r;
while (m->p_right){
m = m->p_right;
}
root->p_left = m;
m->p_right = root;
n = Transfer(q);
root->p_right = n;
n->p_left = root;
//m = Transfer(q);
return r;
}
}
//函数传入二级指针
void CreateBinarySearchTree(int *a,int n, BinaryTreeNode** root){
for (int i = 0; i < n; i++){
BinaryTreeNode* newnode = new BinaryTreeNode;
newnode->mvalue = a[i];
newnode->p_left = NULL;
newnode->p_right = NULL;
InsertNode(root,newnode);
//printTree(*root);
//cout << endl;
}
}
void printTree(BinaryTreeNode *root){
if (root){
printTree(root->p_left);
cout <<root->mvalue << endl;
printTree(root->p_right);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[7] = { 10, 14, 6, 12, 16, 4, 8 };
BinaryTreeNode **root = (BinaryTreeNode**)malloc(sizeof(BinaryTreeNode*));
*root = NULL;
BinaryTreeNode* phead,*q;
CreateBinarySearchTree(a, 7, root);
phead = Transfer(*root);
//printTree(*root);
for (BinaryTreeNode *p = phead; p;q=p, p = p->p_right)
{
cout << p->mvalue << endl;
}
for (BinaryTreeNode *p = q; p; p = p->p_left)
{
cout << p->mvalue << endl;
}
//cout << q->mvalue << endl;
system("pause");
return 0;
}