查找并返回具有通用树中下一个较大元素的节点

时间:2018-07-25 07:28:26

标签: java generics tree

我使用了不同的方法。但是只有2个测试用例成功运行。这是我的代码:

public static TreeNode<Integer> findNextLargerNode(TreeNode<Integer> root, int n){
    Queue<TreeNode<Integer>>pendingNodes = new LinkedList<>();
    pendingNodes.add(root);
    if(root == null)
    {
        return null;
    }
    if(root.data > n)
    {
        return root;
    }
    while(pendingNodes.size()!=0)
    {
        TreeNode<Integer> front = pendingNodes.remove();
        for(int i =0; i<front.children.size(); i++)
        {
            pendingNodes.add(front.children.get(i));
            if(front.children.get(i).data > n)
            {
                return front.children.get(i);
            }
         }
     }
     return null;
 }

请让我知道我在哪里出错。

2 个答案:

答案 0 :(得分:0)

您的代码中有2个主要错误:

  1. if(root.data > n) return root; 考虑以下树:

      40
     /  \ 
    10   30
    

    现在如果以n = 15运行函数会发生什么?根较大,则n返回40,而不是30作为必需输出

  2. if(front.children.get(i).data > n) return front.children.get(i); 考虑以下示例:

      40
     /  \ 
    20   18
    

    同样,以n = 15运行,您将得到20作为在根上检查的第一个孩子。该函数将返回并且不会继续检查其他更合适的节点。

您的最简单方式(可能不是最短)可以使用以下算法来实现:

  1. 遍历所有节点(BFS或DFS)并将数据导出到Array
  2. 找到n的下一个更大的元素
  3. 遍历树并找到包含该数据的节点

答案 1 :(得分:0)

考虑:

if(front.children.get(i).data > n)

通过此if语句,将返回下一个更大的元素。

它适用于以下情况:

21
10 3 20 30 40 2 40 50 0 0 0 0 

但情况如下:

21
10 3 20 20 40 2 40 30 0 0 0 0 

它将返回40,而我们需要30作为答案。