【问题标题】:How to write the code for 'addToRightMostChildAsLeftChild(Node a,Node b)'?如何编写“addToRightMostChildAsLeftChild(Node a,Node b)”的代码?
【发布时间】:2019-04-14 22:57:45
【问题描述】:

假设上面的方法有两个参数a and b

  • a :表示我们需要遍历的树的根节点,直到我们得到正确的节点
  • b :表示要作为左孩子添加到a的最右侧节点的节点。

我只需要知道如何将`节点添加到树的最右边的节点,但作为左子节点。我实际上正在解决不同版本的this 问题。这里的问题是使用右指针

以仅通过左指针遍历树的方式构造一棵树,从而生成树的前序遍历

其实可以通过遍历树并维护一个previous node and linking them in the way we want :prev.left = current`来解决。

我解决这个问题的方法是: 如果有如下一棵树

(只需将节点2到5添加为左孩子 然后是 5 到 3 作为左孩子,最后是 6 到 4 作为左孩子。)

                 10
                 / \
                8   2
               / \ / \
              3  5 4  6


               10
               /
              8
             / \
            3   5
               /
              2
             / \
            4   6

             10
             /
            8
           / 
          3
         /
        5
       /
      2 
     / \
    4   6
             10
             /
            8
           / 
          3
         /
        5
       /
      2
     /
    4
   /
  6

10 8 3 5 2 4 6 这是树的pre-order traversal

我知道这可以通过使用`prev 指针和做一些事情来完成。我希望这样做。

                 10        
                 / \
                8   2      
               / \ / \
              3  5 4  6

                 ||
                 \/

                10
               /
              8
             / 
            3
           /
          5
         /
        2
       /
      4
     /
    6

节点定义为:

 class Node{
    int data;
    Node left,right;
    Node(int d)
    {
        data=d;
        left=null;
        right=null;
    }
}

【问题讨论】:

  • 使用哪种语言?
  • @ZainArshad 它在 Java 中
  • 你有没有尝试过?
  • void addToEnd(Node a, Node b){ if(a.right==null) a.right = b;否则 addToEnd(a.right, b) ; } //我已经尝试在最后添加它但是作为一个正确的孩子
  • 好吧,我只是在编写代码......哈哈哈很高兴你解决了它......你可以在答案中分享解决方案!

标签: java binary-tree traversal


【解决方案1】:

经过一番思考,我能够做到。

void addToRightMostNodeAsLeftChild(Node root,Node toBeAdded)
{
    if(root.left==null)
    {
        root.left=toBeAdded;
    }
    else
    {
        Node k=getRMNode(root.left);
        if(k.left==null)
        {
            k.left=toBeAdded;
        }
        else
            addToRightMostNodeAsLeftChild(k, toBeAdded);
    }
    root.right=null;
}

所以,当我想将节点 2 放置为 5 的 left child 时,它是节点 8 的 最右侧节点(作为左子节点添加到一些XYZ节点XYZ的最右边的节点在这里是8) 当方法调用如下:

addToRightMostNodeAsLeftChild(root,X) /*root represents node 10 and X represents node 2*/

它被转换为:

           10
           /
          8
         / \
        3   5
           /
          2
         / \
        4   6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-26
    • 2020-06-01
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多