题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

代码实现:
public class BinaryTreeNode{ int value; BinaryTreeNode left; BinaryTreeNode right; public BinaryTreeNode(int value,BinaryTreeNode node1,BinaryTreeNode node2){ this.value=value; this.left=node1; this.right=node2; } }
方法一:
定义两个分别指向链表最左端和最右端的变量,然后在中序遍历中不断的修改结点之间的指向,右指针不断的右移,直到遍历结束。
public class Solution{ public static BinaryTreeNode leftHead=null; public static BinaryTreeNode rightHead=null; public static BinaryTreeNode convert(BinaryTreeNode root){ if(root==null){ return null; } convert(root.left); if(leftHead==null){ leftHead=root; rightHead=root; }else{ rightHead.right=root; root.left=rightHead; rightHead=root; } convert(root.right); return leftHead; } public static void inorderTraversal(BinaryTreeNode node){ if(node!=null){ inorderTraversal(node.left); System.out.print(node.value+" "); inorderTraversal(node.right); } } public static void main(String[] args){ BinaryTreeNode node1=new BinaryTreeNode(4,null,null); BinaryTreeNode node2=new BinaryTreeNode(8,null,null); BinaryTreeNode node3=new BinaryTreeNode(6,node1,node2); BinaryTreeNode node4=new BinaryTreeNode(12,null,null); BinaryTreeNode node5=new BinaryTreeNode(16,null,null); BinaryTreeNode node6=new BinaryTreeNode(14,node4,node5); BinaryTreeNode node7=new BinaryTreeNode(10,node3,node6); inorderTraversal(node7); System.out.println(); BinaryTreeNode node8=convert(node7); while(node8!=null){ System.out.print(node8.value+" "); node8=node8.right; } } }
方法二:
public class Solution{ public static BinaryTreeNode convert(BinaryTreeNode root){ if(root==null){ return null; } if(root.left==null&&root.right==null){ return root; } BinaryTreeNode leftNode=convert(root.left); if(leftNode==null){ root.left=null; }else{ while(leftNode.right!=null){ leftNode=leftNode.right; } root.left=leftNode; leftNode.right=root; } BinaryTreeNode rightNode=convert(root.right); root.right=rightNode; if(rightNode!=null){ rightNode.left=root; } return leftNode!=null?leftNode:root; } public static void inorderTraversal(BinaryTreeNode node){ if(node!=null){ inorderTraversal(node.left); System.out.print(node.value+" "); inorderTraversal(node.right); } } public static void main(String[] args){ BinaryTreeNode node1=new BinaryTreeNode(4,null,null); BinaryTreeNode node2=new BinaryTreeNode(8,null,null); BinaryTreeNode node3=new BinaryTreeNode(6,node1,node2); BinaryTreeNode node4=new BinaryTreeNode(12,null,null); BinaryTreeNode node5=new BinaryTreeNode(16,null,null); BinaryTreeNode node6=new BinaryTreeNode(14,node4,node5); BinaryTreeNode node7=new BinaryTreeNode(10,node3,node6); inorderTraversal(node7); System.out.println(); BinaryTreeNode node8=convert(node7); while(node8!=null){ System.out.print(node8.value+" "); node8=node8.right; } } }
posted on
浙公网安备 33010602011771号