排序二叉树转换为双向链表

来源:互联网 发布: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);}}

关于排序二叉树转换为双向链表的问题,以前自己做过,只是用了一个栈,后来在金山的笔试题目里面碰到了,而且不能使用任何额外的空间,就没想起来怎么办。前些天就在网上看一些常规的算法的运算,发现了有人将算法上传了,是将排序二叉树转换为双向循环链表,貌似比现在讨论的这个问题更复杂哈。其实是比目前这个容易解决的,因为头和尾能直接找到,而对于双向链表,要找尾节点还是需要从头遍历到尾的。废话少说,先说这个算法的思路,就是先把一个节点的左右孩子分别转换为双向链表,将父节点独立之后,先将左子树的链表与父节点连在一起,然后就上面的链表跟右子树的链表连接在一起,两个链表合并的操作是,将头一个链表的尾节点与第二个链表的头节点连在一起,就可以了。

  我还做了一个测试,就是从前到后从后到前来输出链表的内容,结果证明是正确的。

原创粉丝点击