二叉查找树转换成排序的双向链表
2015-04-28 21:57
225 查看
题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何
新的结点,只调整指针的指向。
比如将二元查找树
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
思路:对于树的很多题目,都可以使用递归的方法来处理。这道题目也不例外。我们从最基本的思路来考虑这个题目。
把一个二叉树编程双向链表,最终是一个有序的序列,也就是中序遍历之后的结果,那么当我们采用中序遍历的方式遍历二叉树时,遍历到某个节点,是的前序节点的右指针指向当前节点,然后当前节点的左指针指向前序节点,然后使得前序节点指向当前节点。
思路二:如果对于当前节点,我们把右子树转换成双向链表,然后把左子树转换成双向链表,转换的时候我们都标记了链表的头节点和尾节点,那么我们只需要将当前节点和左子树的尾部相连,和右子树的头部相连即可。
新的结点,只调整指针的指向。
比如将二元查找树
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
思路:对于树的很多题目,都可以使用递归的方法来处理。这道题目也不例外。我们从最基本的思路来考虑这个题目。
把一个二叉树编程双向链表,最终是一个有序的序列,也就是中序遍历之后的结果,那么当我们采用中序遍历的方式遍历二叉树时,遍历到某个节点,是的前序节点的右指针指向当前节点,然后当前节点的左指针指向前序节点,然后使得前序节点指向当前节点。
BinTree* head =NULL; void helper(BinTree* root,BinTree*& pre) { if(root == NULL && root == NULL) return ; helper(root->left,pre); if(head == NULL) head = root; if(pre == NULL) pre = root; else { root->left = pre; pre->right = root; pre = root; } //cout<<root->value<<" "<<endl; helper(root->right,pre); } BinTree* SearchTreeConverstToList(BinTree* root) { BinTree* pre = NULL; helper(root,pre); return head; }
思路二:如果对于当前节点,我们把右子树转换成双向链表,然后把左子树转换成双向链表,转换的时候我们都标记了链表的头节点和尾节点,那么我们只需要将当前节点和左子树的尾部相连,和右子树的头部相连即可。
void helper_second(BinTree* root,BinTree*& head,BinTree*& tail) { if(root==NULL || (root->left == NULL && root->right == NULL)) { head = root; tail = root; return; } BinTree* left_head = NULL; BinTree* left_tail = NULL; BinTree* right_head = NULL; BinTree* right_tail = NULL; helper_second(root->left,left_head,left_tail); helper_second(root->right,right_head,right_tail); if(left_head == NULL) head = root; else { head = left_head; left_tail->right = root; root->right = left_tail; } if(right_head == NULL) tail = root; else { tail = right_tail; root->right = right_head; right_head->left = root; } } BinTree* ConverstToList(BinTree* root) { BinTree* head=NULL; BinTree* tail = NULL; helper_second(root,head,tail); return head; }
相关文章推荐
- 微软面试100题系列---把二叉查找树转换成排序的双向链表
- 二叉查找树 转换成 排序的双向链表
- 数据结构——树——二叉查找树转换成排序的循环双向链表
- 算法 把二叉查找树转变成排序的双向链表
- PHP 将二叉查找树转换为双向链表,要求不能创建新节点,只能调节节点指针
- 二元查找树与排序的双向链表的转换
- 【算法题】二元查找树转换成排序的双向链表
- 1、如何将二叉排序树转换为排序的双向链表
- 输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表
- 将二叉搜索树转换成一个排序的双向链表
- 微软等面试100题筛选答案-1-二元查找树转换成一个排序的双向链表
- 【面试题】剑指Offer-27-将二叉搜索树转换成排序的双向链表
- 【面试题】剑指offer27--将一颗二叉搜索树转换成一个排序的双向链表
- 1将该二元查找树转换成一个排序的双向链表
- 将二叉排序树BST转换成排序的双向链表
- 剑指offer 面试题27 二叉搜索树转换为排序双向链表
- 二元查找树转换成一个排序的双向链表
- 二叉查找树转变为排序的双向链表
- 二元查找树转换成一个排序的双向链表
- 将二叉搜索树转换成一个排序的双向链表--中序线索化的变型。