从右到左打印二叉树中的叶节点?

时间:2013-05-10 17:04:30

标签: data-structures tree binary-tree

我正在寻找答案:

  

从二进制树中查找打印叶节点的伪代码   从右到左。

我很高兴听到一些想法。提示(当然不是完整的解决方案)或相关主题的链接可以帮助我理解这个问题,这将会有所帮助。

9 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

void in(node* root){
if(root)
    {   
        if(!root->left && !root->right)
              cout<<root->data<<endl;
        in(root->left);
        in(root->right);
    } }

你可以这样做(C ++中的代码)。

这段代码背后的想法是,按顺序进行遍历/后序遍历&amp;检查是否左侧&amp;正确的孩子是否为NULL。如果它是Null则意味着它是叶子节点。

答案 2 :(得分:0)

您需要使用递归方法,首先将方法传递给二叉树的顶级节点。

在伪代码中,我假设每个节点都定义了“right”和“left”成员,它们本身就是节点和“name”属性,用于打印有关节点的内容。由于您说的是伪代码,因此该方法可能看起来像这样,没有特定的语言:

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)

答案 3 :(得分:0)

  1. 执行有序遍历并仅将叶节点添加到已访问节点列表中。
  2. 还原列表。
  3. 实际上,当在步骤1中创建列表时,继续在头部添加节点并让它指向前一个节点(而不是指向新节点的前一个节点)。

答案 4 :(得分:0)

以相反顺序执行水平顺序遍历时打印叶节点,排除非叶子的节点。

答案 5 :(得分:0)

In Inder / Preorder / postorder但是对于Right Child First然后转到左边的孩子

void postOrder(Node* root)
{
if(root==NULL)
return;
postOrder(root->right);
postOrder(root->left);
if(root->left==NULL && root->right==NULL)
cout << root->data <<" ";
}

答案 6 :(得分:0)

据推测,您知道如何使用递归遍历二叉树。

if

你会注意到,当你这样做时,除了处理非叶子节点之外,你已经按照从左到右的顺序处理了叶子。

要从右向左访问,只需颠倒语句的顺序 - 所以请访问右侧,然后处理值,然后访问左侧。

要仅打印叶节点,只需在handleValue周围放置一个BSTR myBSTRVal; CString BSTRasCString("") char szValue[MAX_PATH] = ""; // This will map the BSTR to a new character string (szValue) WideCharToMultiByte(CP_ACP, 0, myBSTRVal, -1, szValue, sizeof(szValue), NULL, NULL); BSTRasCString.Format("%s", szValue); BSTRasCString.TrimLeft(); BSTRasCString.TrimRight(); 语句,告诉它只输出节点是否为叶子。如果节点既没有左子节点也没有右子节点,则该节点是叶子。

答案 7 :(得分:0)

  

python代码

def Reverse_print(self):
    if self.right:
        self.right.Reverse_print()
    print(self.data),
    if self.left:
        self.left.Reverse_print()

它是递归,它总是正确,直到没有权利 然后在最后右边它回到根打印然后打印左 所以实际上你是从最大值到最低值打印 然后回来,所以同样的事情 然后回来,所以同样的事情 然后回来,所以同样的事情 BLA ... blaa..blaa

答案 8 :(得分:-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);
    }
}