0

私はこれに対する答えを探しています:

二分木の葉ノードを右から左に出力する擬似コードを見つけます。

いくつかのアイデアを聞いてうれしいです。この問題を理解するのに役立つヒント (もちろん、完全な解決策ではありません) または関連トピックへのリンクが役立つでしょう。

4

9 に答える 9

4

ツリーの深さ優先トラバーサルを実行し、最初に正しいサブツリーを処理し、リーフ ノードのみを出力します。

これを実装する最も簡単な方法は、再帰関数を使用することです。

void printLeafNodes(BinaryTreeNode* treePtr) {
  if(treePtr.leftChild == null && treePtr.rightChild == null) {
    //This is a leaf node; print its value
  } else {
    //Recurse on right subtree
    if(treePtr.rightChild != null) {
      printLeafNodes(treePtr.rightChild);
    }
    //Recurse on left subtree
    if(treePtr.leftChild != null) {
      printLeafNodes(treePtr.leftChild);
    }
  }
}

このページは、ソリューションを視覚化するのに非常に役立ちます: Tree Traversal

于 2013-05-10T17:13:22.293 に答える
0

メソッドにバイナリ ツリーの最上位ノードを渡すことから始めて、再帰的なメソッドを使用する必要があります。

疑似コードでは、ノードに関する情報を表示するために、ノード自体がノードである「右」メンバーと「左」メンバー、および「名前」プロパティで各ノードが定義されていると想定しています。メソッドは、疑似コードと言ったので、特定の言語ではなく、次のようになります。

function processNode(parent) {
    if(parent.right = null AND parent.left = null)
        print parent.name
    if(parent.right <> null)
        processNode(parent.right)
    if(parent.left <> null)
        processNode(parent.left)
}

次に、次のように開始します。

processNode(topNode)
于 2013-05-10T17:11:22.007 に答える
-1

古いスレッドを復活させていることは承知していますが、このスレッドを閲覧している他のユーザーの助けになると思います。面接の質問について話している場合、再帰的な回答は回答のほんの一部であり、面接官は反復的なアプローチも聞きたいと思うでしょう. 右から左へのトラバーサル (印刷) は、wiki で説明されている通常の前/後/順番のトラバーサルではありません。ここでの主な考え方は、できる限り右に進み、最初に右端のノードから印刷を開始し、次にその親、次に左のサブツリーから印刷を開始する必要があるということです。

再帰的:

printRightToLeft(Node root){
  if (root == null)
     return;

  // You can check root.right and root.left for null before calling the
  // printRightToLeft function to avoid pushing unneeded data to recursion
  // call stack.

  printRightToLeft(root.right);
  if (root.right == null && root.left == null)
     print(root);
  printRightToLeft(root.left);
}

反復:

printRightToLeft(Node root){
  if (root == null)
    return;

  Stack s = new Stack();
  s.push(root);

  while(!s.isEmpty()){
    Node n = s.top();

    if (n.right != null && !n.visited){
      s.push(n.right);
      n.visited = true;
    } else {
      s.pop();

      if (n.right == null && n.left == null)
         print(n);

      if (n.left != null)
         s.push(n.left);
    }
}
于 2013-05-17T08:19:12.277 に答える