【问题标题】:Binary Search Tree print path二叉搜索树打印路径
【发布时间】:2015-01-04 00:34:59
【问题描述】:

我在尝试创建 TreeNode 方法的打印路径时有点卡住了。不太确定我哪里出错了,但我认为它可能在第二个else

代码:

public static ArrayList<Integer> printPath(TreeNode node, ArrayList<Integer> path, int value) {
        if (node == null) {
            return path;
        } else {
            if (node.data == value) {
                path.add(value);
                return path;
            } else {
                path.add(node.data);
                printPath(node.left, path, value);
                printPath(node.right, path, value);
            }
        }
        return path;
    }

目前我得到的输出为[20, 8, 4, 12, 22],而我应该只得到[20,8,12]

我在图中添加了二叉搜索树,路径为空ArrayList,值为12

【问题讨论】:

  • 得到[20, 8, 4, 12, 22]时传递给方法的参数是什么?
  • @i_turo 更新问题!
  • 不应该是12的路径只有[20, 8, 12]吗?
  • 如果不测试,如果第一次递归调用已经找到value,算法必然也会执行第二次递归调用(第二次else)。

标签: java binary-search-tree


【解决方案1】:

假设您只想要从root-Node 到给定value 的最短路径,您必须将该值与当前节点的数据进行比较,然后决定是向左还是向右(而不是双向)。

public static ArrayList<Integer> printPath(TreeNode node, ArrayList<Integer> path, int value) {
    if (node == null)
        return path;

    path.add(node.data);

    int cmp = Integer.compare(value, node.data);

    if (cmp < 0) // value is smaller, so go left
        printPath(node.left, path, value);
    else if (cmp > 0) // value is larger, so go right
        printPath(node.right, path, value);
    else /* if (cmp == 0) */
         return path; // value found

    return path;
}

这应该在调用时为建议的树提供[20, 8, 12]

printPath(root, new ArrayList<Integer>(), 12);

【讨论】:

    【解决方案2】:
    public static ArrayList<Integer> printPath(TreeNode node, ArrayList<Integer> path, int value) {
            if (node == null) {
                return path;
            } 
            path.add(node.data);
            if (node.data < value) {
                printPath(node.right, path, value);
            } else if(node.data>value){
                printPath(node.left, path, value);
            } 
            return path;
        }
    

    【讨论】:

    • 不应该是path.add(node.data)吗?因为您似乎只是将value 添加到列表中-> 结果将是[12, 12, 12]
    【解决方案3】:

    带有一些示例数据的可测试解决方案:

    import java.util.ArrayList;
    import java.util.List;
    
    
    
    class TreeNode 
    {
         int data;
         TreeNode left;
         TreeNode right;
    
         public TreeNode(int x) { data = x; }
    
    
         public TreeNode(TreeNode node)
         {
             this.data = node.data;
             this.left = node.left;
             this.right = node.right; 
    
         }
    
         public void add(TreeNode node)
         {
    
            if(data > node.data)
            {
    
                if(left == null)
                    left = node;
    
                else
                    left.add(node);
            }
    
            if(data < node.data)
                if(right == null)
                    right = node;
    
                else
                    right.add(node);
         }
    
    
    }
    
    
    class Tree
    {
        TreeNode root;
    
        public Tree(TreeNode node)
        {
            this.root = node;
    
        }
        public Tree()
        {
            this.root = null;
        }
    
        public void add(TreeNode node)
        {
    
            if(root == null)
            {
                root = node;
            }
            if(root.data > node.data){
    
                if(root.left == null)
                    root.left = node;
                else
                    root.left.add(node);
            }
    
            if(root.data < node.data)
            {
                if(root.right == null)
                    root.right = node;
                else
                    root.right.add(node);
            }
    
        }
    
        public void addInt(int value){
    
            add(new TreeNode(value));
    
        }
    
         public void postorder(TreeNode n)
         {
          if (n != null)
          {
           postorder(n.left);
           postorder(n.right);
           System.out.print(n.data + " ");
          }
         }
    
         public void inorder(TreeNode n)
         {
          if (n != null)
          {
           inorder(n.left);
           System.out.print(n.data + " ");
           inorder(n.right);
          }
         }
    
    }
    
    
    public class TreeTest
    {
    
    
        public static void main(String[] args)
        {
    
            Tree tree = new Tree();
    
            tree.add(new TreeNode(3));
            tree.add(new TreeNode(2));
            tree.add(new TreeNode(5));
            tree.add(new TreeNode(9));
            tree.add(new TreeNode(4));
            tree.add(new TreeNode(1));
            tree.add(new TreeNode(10));
            tree.addInt(11);
    
    
            ArrayList<Integer> mylist = printPath(tree.root, new ArrayList<Integer>(),10);
    
            System.out.println("the path is "+mylist);
    
            tree.inorder(tree.root);
            System.out.println("");
            tree.postorder(tree.root);
    
    
        }
    
        public static ArrayList<Integer> printPath(TreeNode node, ArrayList<Integer> path, int value) {
    
            if (node == null) {
                return path;
            } 
    
            if (node.data == value) {
                path.add(value);
                return path;
            } 
    
            if(node.data > value){
                path.add(node.data);
                printPath(node.left, path, value);
            }
            if(node.data < value) {
                path.add(node.data);
                printPath(node.right,path, value);    
            }
    
            return path;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多