排序二叉树转换为双向链表
来源:互联网 发布:cnzz 阿里云备案 编辑:程序博客网 时间:2024/04/25 15:47
public class TreeNode {public int data;public TreeNode left;public TreeNode right;public TreeNode(int data){this.data=data;left=null;right=null;}}public class Tree { public TreeNode root; //排序二叉树中插入节点 public void add(int data) { TreeNode node=new TreeNode(data); if(root==null) root=node; else { TreeNode current=root; TreeNode parent=root; boolean isLeft=true; while(current!=null) { parent=current; if(data<current.data) { isLeft=true; current=current.left; } else { isLeft=false; current=current.right; } } if(isLeft) parent.left=node; else parent.right=node; } } //将两个链表合并 public TreeNode append(TreeNode node1,TreeNode node2) { if(node1==null) return node2; if(node2==null) return node1; TreeNode tail=node1; while(tail.right!=null) tail=tail.right; tail.right=node2; node2.left=tail; return node1; } //转换 public TreeNode convertoList(TreeNode node) { if(node==null) return null; TreeNode left=convertoList(node.left); TreeNode right=convertoList(node.right);//将父节点独立 node.left=null; node.right=null; left=append(left,node); left=append(left,right); return left; } public void display(TreeNode head) { TreeNode current=head; TreeNode parent=head; while(current!=null) { System.out.print(current.data+" "); parent=current; current=current.right; } System.out.println(); while(parent!=null) { System.out.print(parent.data+" "); parent=parent.left; } }}public class Test {/** * @param args */public static void main(String[] args) {Tree tree=new Tree();tree.add(49);tree.add(25);tree.add(55);tree.add(10);tree.add(51);tree.add(65); TreeNode head=tree.convertoList(tree.root); tree.display(head);}}
关于排序二叉树转换为双向链表的问题,以前自己做过,只是用了一个栈,后来在金山的笔试题目里面碰到了,而且不能使用任何额外的空间,就没想起来怎么办。前些天就在网上看一些常规的算法的运算,发现了有人将算法上传了,是将排序二叉树转换为双向循环链表,貌似比现在讨论的这个问题更复杂哈。其实是比目前这个容易解决的,因为头和尾能直接找到,而对于双向链表,要找尾节点还是需要从头遍历到尾的。废话少说,先说这个算法的思路,就是先把一个节点的左右孩子分别转换为双向链表,将父节点独立之后,先将左子树的链表与父节点连在一起,然后就上面的链表跟右子树的链表连接在一起,两个链表合并的操作是,将头一个链表的尾节点与第二个链表的头节点连在一起,就可以了。
我还做了一个测试,就是从前到后从后到前来输出链表的内容,结果证明是正确的。
- 排序二叉树转换为双向链表
- 查找二叉树转换为排序的双向链表
- 二叉搜索树转换为排序双向链表
- 将二叉树转换为排序双向链表
- 双向链表(4) - 排序二叉树转换为循环双向链表
- 二叉树转换为双向链表
- 二叉树转换为双向链表
- 二叉树转换为双向链表
- 二叉树转换为双向链表
- 二叉树转换为双向链表
- 二叉树转换为双向链表
- 树:将二叉搜索树转换为排序的双向链表
- 剑指offer 面试题27 二叉搜索树转换为排序双向链表
- 第1题:把二叉搜索树转换为一个排序的双向链表
- 如何将一个排序二叉树转换为循环双向链表
- 《编程之美》——二叉搜索树转换为排序双向链表
- (算法)二叉树转换为双向链表
- 把二叉树转换为双向链表
- JavaScript表单验证大全
- ExtJS EditorGridPanel中时间日期编辑问题的总结
- C、C++中的日期和时间 time_t与struct tm转换
- myeclipse修改发布到tomcat目录下的项目名称
- Qt 进程间通讯学习(windows消息WM_COPYDATA)
- 排序二叉树转换为双向链表
- Spring注解@Component、@Repository、@Service、@Controller
- android listview分页异步加载图片及图片缓存
- Asp.net 2.0 中的TreeView的右键菜单
- winform调用config文件
- DNS报文格式
- 在Qt中使用sleep (转)
- Linux命令:检查系统资源变化(vmstat)!
- Spring Security 可动态授权RBAC权限模块实践