给定一棵二叉树,任务是从左到右打印给定二叉树的所有叶节点。也就是说,节点应按照它们在给定树中从左到右出现的顺序进行打印。
例子:
Input :
1
/ \
2 3
/ \ / \
4 5 6 7
Output : 4 5 6 7
Input :
4
/ \
5 9
/ \ / \
8 3 7 2
/ / \
12 6 1
Output : 12 3 7 6 1
我们已经讨论了使用两个堆栈的迭代方法。
方法:想法是使用一个堆栈执行迭代后遍历并打印叶节点。
下面是上述方法的实现:
C++
// C++ program to print leaf nodes from
// left to right using one stack
#include
using namespace std;
// Structure of binary tree
struct Node {
Node* left;
Node* right;
int data;
};
// Function to create a new node
Node* newNode(int key)
{
Node* node = new Node();
node->left = node->right = NULL;
node->data = key;
return node;
}
// Function to Print all the leaf nodes
// of Binary tree using one stack
void printLeafLeftToRight(Node* p)
{
// stack to store the nodes
stack s;
while (1) {
// If p is not null then push
// it on the stack
if (p) {
s.push(p);
p = p->left;
}
else {
// If stack is empty then come out
// of the loop
if (s.empty())
break;
else {
// If the node on top of the stack has its
// right subtree as null then pop that node and
// print the node only if its left
// subtree is also null
if (s.top()->right == NULL) {
p = s.top();
s.pop();
// Print the leaf node
if (p->left == NULL)
printf("%d ", p->data);
}
while (p == s.top()->right) {
p = s.top();
s.pop();
if (s.empty())
break;
}
// If stack is not empty then assign p as
// the stack's top node's right child
if (!s.empty())
p = s.top()->right;
else
p = NULL;
}
}
}
}
// Driver Code
int main()
{
Node* root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
root->right->left = newNode(6);
root->right->right = newNode(7);
printLeafLeftToRight(root);
return 0;
}
Java
// Java program to print leaf nodes from
// left to{ right using one stack
import java.util.*;
class GfG
{
// Structure of binary tree
static class Node
{
Node left;
Node right;
int data;
}
// Function to create a new node
static Node newNode(int key)
{
Node node = new Node();
node.left = null;
node.right = null;
node.data = key;
return node;
}
// Function to Print all the leaf nodes
// of Binary tree using one stack
static void printLeafLeftToRight(Node p)
{
// stack to store the nodes
Stack s = new Stack ();
while (true)
{
// If p is not null then push
// it on the stack
if (p != null)
{
s.push(p);
p = p.left;
}
else
{
// If stack is empty then come out
// of the loop
if (s.isEmpty())
break;
else
{
// If the node on top of the stack has its
// right subtree as null then pop that node and
// print the node only if its left
// subtree is also null
if (s.peek().right == null)
{
p = s.peek();
s.pop();
// Print the leaf node
if (p.left == null)
System.out.print(p.data + " ");
}
while (p == s.peek().right)
{
p = s.peek();
s.pop();
if (s.isEmpty())
break;
}
// If stack is not empty then assign p as
// the stack's top node's right child
if (!s.isEmpty())
p = s.peek().right;
else
p = null;
}
}
}
}
// Driver Code
public static void main(String[] args)
{
Node root = newNode(1);
root.left = newNode(2);
root.right = newNode(3);
root.left.left = newNode(4);
root.left.right = newNode(5);
root.right.left = newNode(6);
root.right.right = newNode(7);
printLeafLeftToRight(root);
}
}
// This code is contributed by Prerna Saini
Python3
# Python3 program to print leaf nodes from
# left to right using one stack
# Binary tree node
class newNode:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
# Function to Print all the leaf nodes
# of Binary tree using one stack
def printLeafLeftToRight(p):
# stack to store the nodes
s = []
while (1):
# If p is not None then push
# it on the stack
if (p):
s.insert(0, p)
p = p.left
else:
# If stack is empty then come out
# of the loop
if len(s) == 0:
break
else:
# If the node on top of the stack has its
# right subtree as None then pop that node
# and print the node only if its left
# subtree is also None
if (s[0].right == None):
p = s[0]
s.pop(0)
# Print the leaf node
if (p.left == None):
print(p.data, end = " ")
while (p == s[0].right):
p = s[0]
s.pop(0)
if len(s) == 0:
break
# If stack is not empty then assign p as
# the stack's top node's right child
if len(s):
p = s[0].right
else:
p = None
# Driver Code
root = newNode(1)
root.left = newNode(2)
root.right = newNode(3)
root.left.left = newNode(4)
root.left.right = newNode(5)
root.right.left = newNode(6)
root.right.right = newNode(7)
printLeafLeftToRight(root)
# This code is contributed by SHUBHAMSINGH10
C#
// C# program to print leaf nodes from
// left to{ right using one stack
using System;
using System.Collections.Generic;
class GfG
{
// Structure of binary tree
public class Node
{
public Node left;
public Node right;
public int data;
}
// Function to create a new node
static Node newNode(int key)
{
Node node = new Node();
node.left = null;
node.right = null;
node.data = key;
return node;
}
// Function to Print all the leaf nodes
// of Binary tree using one stack
static void printLeafLeftToRight(Node p)
{
// stack to store the nodes
Stack s = new Stack ();
while (true)
{
// If p is not null then push
// it on the stack
if (p != null)
{
s.Push(p);
p = p.left;
}
else
{
// If stack is empty then come out
// of the loop
if (s.Count == 0)
break;
else
{
// If the node on top of the stack has its
// right subtree as null then pop that node and
// print the node only if its left
// subtree is also null
if (s.Peek().right == null)
{
p = s.Peek();
s.Pop();
// Print the leaf node
if (p.left == null)
Console.Write(p.data + " ");
}
while (p == s.Peek().right)
{
p = s.Peek();
s.Pop();
if (s.Count == 0)
break;
}
// If stack is not empty then assign p as
// the stack's top node's right child
if (s.Count != 0)
p = s.Peek().right;
else
p = null;
}
}
}
}
// Driver Code
public static void Main(String[] args)
{
Node root = newNode(1);
root.left = newNode(2);
root.right = newNode(3);
root.left.left = newNode(4);
root.left.right = newNode(5);
root.right.left = newNode(6);
root.right.right = newNode(7);
printLeafLeftToRight(root);
}
}
// This code has been contributed by 29AjayKumar
输出:
4 5 6 7
如果您希望与行业专家一起参加现场课程,请参阅《 Geeks现场课程》和《 Geeks现场课程美国》。