二叉查找树转变成有序的双向链表
2011-10-18 23:56
169 查看
题目要求:将二叉查找树转换成排序的双向链表,不能创建新节点,只调整指针。
查找树的结点定义如下:
既然是树,其定义本身就是递归的,自然用递归算法处理就很容易。
将根结点的左子树和右子树转换为有序的双向链表,然后根节点的left指针指向左子树结果的最后一个结点,同时左子树最后一个结点的right指针指向根节点;根节点的right指针指向右子树结果的第一个结点,同时右子树第一个结点的left指针指向根节点。
查找树的结点定义如下:
class Node { public: Node(int x):left(NULL),right(NULL),data(x){}; Node * left; Node * right; int data; };
既然是树,其定义本身就是递归的,自然用递归算法处理就很容易。
将根结点的左子树和右子树转换为有序的双向链表,然后根节点的left指针指向左子树结果的最后一个结点,同时左子树最后一个结点的right指针指向根节点;根节点的right指针指向右子树结果的第一个结点,同时右子树第一个结点的left指针指向根节点。
/* 参数: 结点的指针,以r所指结点为根节点的树转换成双向链表后, 链表第一个结点的指针first,链表最后一个结点的指针last */ void Convert(Node * r,Node * & first,Node * & last) { //左子树和右子树结果的指针 Node *firstL,*lastL,*firstR,*lastR; if(r==NULL) return; Convert(r->left,firstL,lastL); Convert(r->right,firstR,lastR); if(r->left==NULL) { /*如果左子树是空的,那么以r所指结点为根结点的树 转换结果的第一个结点的指针就是r*/ first=r; r->left=NULL; } else { /*以r所指结点为根节点的树转换成双向链表后,链表第一个结点的指针first 就是左子树结果的第一个结点的指针firstL*/ first=firstL; /*r->left指向左子树结果的最后一个结点, 同时左子树最后一个结点的right指针指向r所指结点*/ r->left=lastL; lastL->right=r; } if(r->right==NULL) { /*如果右子树是空的,那么以r所指结点为根结点的树 转换结果的最后一个结点的指针就是r*/ last=r; r->right=NULL; } else { /*以r所指结点为根节点的树转换成双向链表后,链表最后一个结点的指针last 就是右子树结果的最后一个结点的指针lastR*/ last=lastR; /*r->right向右子树结果的第一个结点, 同时右子树第一个结点的right指针指向r所指结点*/ r->right=firstR; firstR->left=r; } }
相关文章推荐
- 二叉查找树转变为有序双向链表
- 二叉查找树转变为有序双向链表
- 二叉查找树转换为有序双向链表
- [程序猿面试题精选100称号]1.转变为一个二叉搜索树有序双向链表
- 将二叉查找树变为有序的双向链表
- 二叉查找树转换成有序的双向链表
- 将有序数组转变成平衡二叉查找树
- 程序员面试100题(算法)之把二叉查找树转变成排序的双向链表(含二叉树前序创建、递归)
- 算法基础 - 二叉查找树变成有序双向链表
- 【转】把二叉查找树转变成排序的双向链表(中序遍历)
- 有序数组创建高度最小的二叉查找树
- 《数据结构与算法》学习笔记15 有序链表和双向链表
- 【微软100题】001把二元查找树转变成排序的双向链表(树)
- 把二元查找树转变成排序的双向链表
- 将搜索二叉树转换成有序的双向链表
- 把二元查找树转变成排序的双向链表(树)
- 把二元查找树转变成排序的双向链表
- 有序的双向链表实现
- 给定一个有序数组,元素各不相同且升序排列,创建一个高度最小的二叉查找树
- 1.把二元查找树转变成排序的双向链表