我正在寻找答案:
从二进制树中查找打印叶节点的伪代码 从右到左。
我很高兴听到一些想法。提示(当然不是完整的解决方案)或相关主题的链接可以帮助我理解这个问题,这将会有所帮助。
答案 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中创建列表时,继续在头部添加节点并让它指向前一个节点(而不是指向新节点的前一个节点)。
答案 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);
}
}