1.把二元查找树转变成排序的双向链表(树)
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
首先我们定义的二元查找树 节点的数据结构如下:
struct BSTreeNode
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
};
#include <iostream>
struct BSTreeNode
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
BSTreeNode();
BSTreeNode(int value);
};
void change(BSTreeNode** root,BSTreeNode** temp);
void insert(BSTreeNode** root,int n);
int main()
{
BSTreeNode* root = NULL;
BSTreeNode* temp = NULL;
insert(&root,10);
insert(&root,6);
insert(&root,14);
insert(&root,4);
insert(&root,8);
insert(&root,12);
insert(&root,16);
change(&root,&temp);
system("pause");
return 0;
}
void change(BSTreeNode** root,BSTreeNode** temp)
{
BSTreeNode* current = *root ;
if (current != NULL)
{
BSTreeNode* left = (*root)->m_pLeft ; //此处要用临时的变量存储左右孩子
BSTreeNode* right= (*root)->m_pRight ;
change(&left,temp);
if (*temp == NULL)
*temp = *root ;
else
{
(*temp)->m_pRight = *root ;
(*root)->m_pLeft = *temp ;
*temp = *root ;
}
change(&right,temp);
}
}
void insert(BSTreeNode** root,int n)
{
BSTreeNode* temp = new BSTreeNode;
BSTreeNode* current ;
temp->m_nValue = n ;
temp->m_pLeft = NULL ;
temp->m_pRight = NULL ;
if (*root == NULL)
{
*root = new BSTreeNode(n);
}
else
{
current = *root ;
while(current != NULL)
{
if (current->m_nValue>n&¤t->m_pLeft==NULL)
{
current->m_pLeft = temp ;
break;
}
else if (current->m_nValue>n&¤t->m_pLeft!=NULL)
{
current = current->m_pLeft;
continue;
}
else if (current->m_nValue<n&¤t->m_pRight==NULL)
{
current->m_pRight = temp;
break;
}
else if (current->m_nValue<n&¤t->m_pRight!=NULL)
{
current = current->m_pRight;
continue;
}
}
}
}
BSTreeNode::BSTreeNode(int value)
{
m_nValue = value ;
m_pLeft = NULL ;
m_pRight = NULL ;
}
BSTreeNode::BSTreeNode()
{}
本文介绍如何将一棵二叉查找树不借助额外节点转换为排序的双向链表。通过递归方法调整节点间的指针连接实现转换,并提供完整的C++实现代码。
6万+

被折叠的 条评论
为什么被折叠?



