[算法] 把二元查找树转变成排序的双向链表
2013-10-16 15:46
483 查看
题目要求:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
分析:
二元查找树:它首先要是一棵二元树,在这基础上它或者是一棵空树;或者是具有下列性质的二元树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二元查找树
在逻辑上可以通过中序遍历二元查找树,对每一个根节点进行如下操作(假设当前双向链表的尾节点是index, 头节点是head):
(1)把根节点的左孩子指向index。
(2)把index的右孩子指向根节点。 这里要判断index是否已存在,如果不存在则这个根节点就是双向链表的头节点。
这两步可以建立尾节点index与根节点的双向连接。
(3)把index修改为最后一个节点。
代码实现如下,用C++语言,已编译通过并运行成功。
View Code
2013/10/16 于OF W4
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
分析:
二元查找树:它首先要是一棵二元树,在这基础上它或者是一棵空树;或者是具有下列性质的二元树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二元查找树
在逻辑上可以通过中序遍历二元查找树,对每一个根节点进行如下操作(假设当前双向链表的尾节点是index, 头节点是head):
(1)把根节点的左孩子指向index。
(2)把index的右孩子指向根节点。 这里要判断index是否已存在,如果不存在则这个根节点就是双向链表的头节点。
这两步可以建立尾节点index与根节点的双向连接。
(3)把index修改为最后一个节点。
代码实现如下,用C++语言,已编译通过并运行成功。
#include <stdio.h> #include <iostream> #include <string> struct TreeNode { int value; TreeNode* leftNode; TreeNode* rightNode; }; typedef TreeNode DoubleList; DoubleList* head; DoubleList* index; void AddNodeToTree(TreeNode* &treeHead, int value); void OrderTree(TreeNode* treeHead); void ConvertToDoubleList(TreeNode* currentNode); void OutputDoubleList(); void AddNodeToTree(TreeNode* &treeHead, int value) { if(treeHead == NULL) { TreeNode* node = new TreeNode(); node->value = value; node->leftNode = NULL; node->rightNode = NULL; treeHead = node; } else { if(value >= treeHead->value) { AddNodeToTree(treeHead->leftNode,value); } else { AddNodeToTree(treeHead->rightNode,value); } } } void OrderTree(TreeNode* treeHead) { if(treeHead == NULL) { return; } if(treeHead->leftNode != NULL) { OrderTree(treeHead->leftNode); } ConvertToDoubleList(treeHead); cout<<treeHead->value<<" "; if(treeHead->rightNode != NULL) { OrderTree(treeHead->rightNode); } } void ConvertToDoubleList(TreeNode* currentNode) { currentNode->leftNode = index; if(index != NULL) { index->rightNode = currentNode; } else { head = currentNode; } index=currentNode; } void OutputDoubleList() { DoubleList *temp = head; while(temp != NULL) { cout<<temp->value<<" "; temp=temp->rightNode; } } int _tmain(int argc, _TCHAR* argv[]) { TreeNode* BSTree = NULL; AddNodeToTree(BSTree, 10); AddNodeToTree(BSTree, 1); AddNodeToTree(BSTree, 7); AddNodeToTree(BSTree, 6); AddNodeToTree(BSTree, 8); AddNodeToTree(BSTree, 4); AddNodeToTree(BSTree, 5); AddNodeToTree(BSTree, 2); OrderTree(BSTree); OutputDoubleList(); return 0; }
View Code
2013/10/16 于OF W4
相关文章推荐
- 每天学一个算法(2)------二元查找树转变成排序的双向链表
- 算法-1.把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表——精选微软经典的算法面试100题中第一题
- 算法面试100题——1、把二元查找树转变成排序的双向链表
- 中序线索二叉树算法 解决 把二元查找树转变成排序的双向链表
- 每天学习一算法系列(2)(把二元查找树转变成排序的双向链表,要求输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.)
- 算法与数据结构面试题(1)-把二元查找树转变成排序的双向链表
- 每日一道算法题1 ——把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表--算法001
- 二元查找树转变成排序的双向链表之C#算法实现
- 二元查找树转变成排序的双向链表之C#算法实现
- [面试中的算法]把二元查找树转变成排序的双向链表
- 【老鸟学算法】二元查找树转变成排序的双向链表——算法思想及java实现
- 算法-把二元查找树转变成排序的双向链表
- 算法1-把二元查找树转变成排序的双向链表
- 微软等数据结构+算法面试100题(43)-- 把二元查找树转变成排序的双向链表
- 每天一道算法题(8)——把二元查找树转变成排序的双向链表
- 每天一算法(把二元查找树转变成排序的双向链表 )
- 每天一道算法题(8)——把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表