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

代码实现:

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 2018-11-06 22:39  会飞的金鱼  阅读(81)  评论(0)    收藏  举报