二叉搜索树与双向链表
来源:互联网 发布:程序员群头像 编辑:程序博客网 时间:2024/06/06 17:05
题目描述:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
问题分析:
在二叉树中,每个节点都有两个指向子节点的指针;同样,在双向链表中,每个节点也有两个指针。这两种数据结构相似,是有可能实现二叉搜索树与双向链表的转化的。
在搜索二叉树中,左子节点总是小于父节点的,右子节点总是大于父节点的,因此在转换的时候,原先指向左子节点的指针调整为链表中指向前一个节点的指针,原先指向右子节点的指针调整为链表中指向后一个节点指针。所以,我们就有了解题思路。
把根节点与左右子树分开,找到左子树最大的节点pleft,pleft.right指向根节点root,root.left指向pleft;找到右子树最小的节点pright,pright.left指向root,root.right指向pright;然后左子树与右子树的处理方法与上面一样,对其进行递归。
参考代码如下:
/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class TreeNodeConvertList { public TreeNode Convert(TreeNode pRootOfTree) { if(pRootOfTree==null) return null; pRootOfTree=ConvertTreeNode(pRootOfTree); while( pRootOfTree.left!=null) pRootOfTree=pRootOfTree.left; return pRootOfTree; } public TreeNode ConvertTreeNode(TreeNode root){ if(root==null) return null; if(root.left!=null){ TreeNode left=ConvertTreeNode(root.left); //找到左子树中最大的节点,然后与root根节点连接 while(left.right!=null) left=left.right; left.right=root; root.left=left; } if(root.right!=null){ TreeNode right=ConvertTreeNode(root.right); //找到右子树中最小的节点,然后与root根节点连接 while(right.left!=null) right=right.left; right.left=root; root.right=right; } return root; } }
阅读全文
0 0
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- AngularJS之内置指令汇总
- Java中关于final修饰符的几个知识点
- Ubuntu系统安装QT
- 一种基于C++的扑克牌实现
- 新闻客户端
- 二叉搜索树与双向链表
- 汇编语言(第三版)检测点笔记
- Kotlin基础教程-运算符重载
- 电子信息工程专业大一学生的软件之路
- 检查nginx反向代理节点状态
- leetcode Longest Substring Without Repeating Character(Java)
- thrift
- 5-9 互评成绩 (25分)
- 欢迎使用CSDN-markdown编辑器