输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ /
6 14
/ / / /
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
算法思想:
1,递归;以某个节点为根的子树所生成的链表=(左子树生成的链表)+根节点+(右子树生成的链表)
2,循环;按照中序遍历的非递归方法,把节点压栈;弹栈弹出的节点依次挂到链表上
代码:
#include <iostream>
#include <stack>
using namespace std;
class Node{//Node节点的结构
public:
int key;
Node * left;
Node * right;
Node(int k):key(k),left(NULL),right(NULL){}
Node(void):key(0),left(NULL),right(NULL){}
};
class BTree{//Tree的结构
public:
Node * root;
BTree():root(NULL){}
};
class RList{//双向链表的结构
public:
Node * head;
Node * rear;
RList():head(NULL),rear(NULL){}
};
void AddNode(Node * new_node,Node * & root){//向二叉查找树中加入节点。此处第二个参数必须是Node * &。
if(root==NULL)
root=new_node;
else{
if(root->key>new_node->key)
AddNode(new_node,root->left);
else if(root->key<new_node->key)
AddNode(new_node,root->right);
}
}
RList * BTreeToList(Node * root){//递归的方法求双向链表
if(root==NULL){
RList * list=new RList();
return list;
}
else{
RList * left_list=BTreeToList(root->left);
RList * right_list=BTreeToList(root->right);
RList * list=new RList();
if(left_list->head==NULL){//如果左边的表是空表
list->head=root;
}
else{
list->head=left_list->head;
left_list->rear->right=root;//把root节点挂到左边的链表的尾部
root->left=left_list->rear;
}
if(right_list->rear==NULL){//右边的表是空表
list->rear=root;
}
else{
list->rear=right_list->rear;
root->right=right_list->head;//把root节点挂到右边的链表的头部
right_list->head->left=root;
}
return list;
}
}
RList * BTreeToListWithStack(BTree * bt){//非递归的方法建立双链表;使用循环法中序遍历的思想
stack<Node *> nodestack;//栈——保存节点
nodestack.push(bt->root);
RList * RL=new RList();
while (!nodestack.empty()){
Node * node=nodestack.top()->left;
nodestack.top()->left=NULL;//如果没有这一步会出现什么??
if(node!=NULL){
nodestack.push(node);
}
else{
Node * popednode=nodestack.top();
nodestack.pop();//弹栈
if (popednode->right!=NULL) {
nodestack.push(popednode->right);
}
//将popednode挂到链表上
if(RL->head==NULL){
RL->head=popednode;
RL->rear=popednode;
}
else{
RL->rear->right=popednode;
popednode->left=RL->rear;
RL->rear=popednode;
}
//挂接完成
}
}
return RL;
}
int main(){
BTree * bt=new BTree();
for(int i=0;i<5;i++){
int a=0;
cin>>a;
Node * new_Node=new Node(a);
AddNode(new_Node,bt->root);
}
RList * RL=BTreeToListWithStack(bt);
//输出双向链表
Node * index=RL->head;
do{
cout<<index->key<<' ';
index=index->right;
} while (index!=RL->rear);
cout<<RL->rear->key<<endl;
return 0;
}
==========================
qq博客上也有
相关推荐
二叉树转换为双向链表 通过随机创建二叉排序树测试二叉树转换为双向链表是否正确 http://blog.csdn.net/ssuchange/article/details/17383625
本话题涵盖了三种重要的数据结构:双向链表、二叉树以及哈弗曼树。这些数据结构在算法设计、数据库系统、编译器和各种软件开发中都有广泛应用。下面我们将深入探讨这三种数据结构的构建方法。 首先,我们来讨论双向...
把二叉查找树转变成排序的双向链表 例如: 转换成双向链表 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; // ...
### 排序树变成双向链表 在计算机科学领域,数据结构是算法设计与实现的基础。其中,排序树(如二叉搜索树)是一种重要的非线性数据结构,它不仅支持快速查找、插入和删除操作,还能保持元素的有序性。而双向链表则...
而将一个二叉搜索树转换为双向链表,可以进一步优化某些操作,如顺序遍历,因为链表提供了连续的访问方式。 双向链表(Doubly Linked List)是一种线性数据结构,其中每个节点包含数据和两个指针,分别指向其前一个...
微软面试题,输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。适合新手入门结构清晰易懂
而在三叉链表存储表示中,每个节点除了包含数据域外,还增加了指向父节点的指针域,形成一个完整的双向链接结构,便于进行遍历和操作。 首先,文档定义了基本的数据类型`TElemType`用于存储二叉树节点的元素,可以...
而将一个二叉搜索树转换成一个排序的双向链表,则可以利用其天然的有序性,优化某些特定算法的实现,如在链表中进行连续操作。 题目“剑指offer”中的面试题27,就是关于这个转换过程。这个过程的核心在于如何通过...
0426. 将二叉搜索树转化为排序的双向链表标签:栈、树、深度优先搜索、二叉搜索树、链表、二叉树、双向链表难度:中等题目大意给定一棵二叉树的根节点 root。如
0426. 将二叉搜索树转化为排序的双向链表标签:栈、树、深度优先搜索、二叉搜索树、链表、二叉树、双向链表难度:中等题目大意给定一棵二叉树的根节点 root。如
双向链表(Doubly Linked List)则是一种线性数据结构,其中每个元素(节点)都有指向前后相邻元素的指针。这种结构允许我们在O(1)的时间复杂度内进行前向或后向遍历。 在给定的题目中,我们需要将一个二叉搜索树...
例如,单链表仅支持向前移动,而双向链表允许前后移动,更便于插入和删除操作。 二叉树和链表在算法设计和数据处理中起着关键作用。二叉树适合于构建查找和排序结构,如二分查找、AVL树和红黑树等;链表则适用于...
链表分为单向链表、双向链表和循环链表等类型,它们各有优缺点,如单向链表插入和删除操作相对简便,但访问元素不如数组直接。 栈是一种后进先出(LIFO)的数据结构,常被比喻为一个堆叠的盘子。栈的操作主要包括压...
使用C语言编写,将二叉树转换成双向链表源代码,记录学习,分享给有需要的人。
17循环链表 18双项链表 19链式栈 20链式队列 21STL_list类 22基数排序 23属 24二叉树 25二叉树找数 26红黑树 27红黑树_0 28红黑树_1 29红黑树_2 30红黑树_3 31红黑树_4 32红黑树_5 33红黑树_6 34堆 35堆排序 36...
在本题中,我们面临的任务是将一棵二叉搜索树转换为一个排序的循环双向链表。 双向链表(Doubly Linked List)是一种数据结构,其中每个节点包含两个指针,一个指向前一个节点(前驱),另一个指向后一个节点(后继...
双向链表提供了更灵活的访问,可以从任一方向遍历链表,插入和删除操作也更为复杂,因为需要更新两个指针。 4. **静态顺序队列**: 静态顺序队列使用固定大小的数组来存储元素,入队和出队操作受限于数组的容量。...
这里我们探讨的主题包括“用队列和栈判断回文”、“赫夫曼数”、“双向链表”以及“内部排序(8种)”。下面将详细阐述这些知识点。 1. **用队列和栈判断回文**: 回文是指正读反读都能读通的字符串,如“level”...