打印二叉树的最左边和最右边的节点
给定一棵二叉树,打印每一层的角节点。最左边的节点和最右边的节点。
例如,跟随的输出是15, 10, 20, 8, 25 。
一个简单的解决方案是使用讨论的打印左视图和右视图的方法进行两次遍历。
我们可以使用一次遍历打印所有角节点吗?
这个想法是使用水平顺序遍历。每次我们将队列的大小存储在一个变量 n 中,即该级别的节点数。对于每一层,我们检查当前节点是否是第一个(即索引为 0 的节点)和最后一个索引的节点(即索引为 n-1 的节点),如果是其中任何一个,则打印该节点的值.
// C/C++ program to print corner node at each level
// of binary tree
#include
Java
// Java program to print corner node at each level in a binary tree
import java.util.*;
/* A binary tree node has key, pointer to left
child and a pointer to right child */
class Node
{
int key;
Node left, right;
public Node(int key)
{
this.key = key;
left = right = null;
}
}
class BinaryTree
{
Node root;
/* Function to print corner node at each level */
void printCorner(Node root)
{
// star node is for keeping track of levels
Queue q = new LinkedList();
// pushing root node and star node
q.add(root);
// Do level order traversal of Binary Tree
while (!q.isEmpty())
{
// n is the no of nodes in current Level
int n = q.size();
for(int i = 0 ; i < n ; i++){
// dequeue the front node from the queue
Node temp = q.peek();
q.poll();
//If it is leftmost corner value or rightmost corner value then print it
if(i==0 || i==n-1)
System.out.print(temp.key + " ");
//push the left and right children of the temp node
if (temp.left != null)
q.add(temp.left);
if (temp.right != null)
q.add(temp.right);
}
}
}
// Driver program to test above functions
public static void main(String[] args)
{
BinaryTree tree = new BinaryTree();
tree.root = new Node(15);
tree.root.left = new Node(10);
tree.root.right = new Node(20);
tree.root.left.left = new Node(8);
tree.root.left.right = new Node(12);
tree.root.right.left = new Node(16);
tree.root.right.right = new Node(25);
tree.printCorner(tree.root);
}
}
// This code has been contributed by Utkarsh Choubey
Python3
# Python3 program to print corner
# node at each level of binary tree
from collections import deque
# A binary tree node has key, pointer to left
# child and a pointer to right child
class Node:
def __init__(self, key):
self.key = key
self.left = None
self.right = None
# Function to print corner node at each level
def printCorner(root: Node):
# If the root is null then simply return
if root == None:
return
# Do level order traversal
# using a single queue
q = deque()
q.append(root)
while q:
# n denotes the size of the current
# level in the queue
n = len(q)
for i in range(n):
temp = q[0]
q.popleft()
# If it is leftmost corner value or
# rightmost corner value then print it
if i == 0 or i == n - 1:
print(temp.key, end = " ")
# push the left and right children
# of the temp node
if temp.left:
q.append(temp.left)
if temp.right:
q.append(temp.right)
# Driver Code
if __name__ == "__main__":
root = Node(15)
root.left = Node(10)
root.right = Node(20)
root.left.left = Node(8)
root.left.right = Node(12)
root.right.left = Node(16)
root.right.right = Node(25)
printCorner(root)
# This code is contributed by sanjeev2552
C#
// C# program to print corner node
// at each level in a binary tree
using System;
using System.Collections.Generic;
/* A binary tree node has key, pointer to left
child and a pointer to right child */
public class Node
{
public int key;
public Node left, right;
public Node(int key)
{
this.key = key;
left = right = null;
}
}
public class BinaryTree
{
Node root;
/* Function to print corner node at each level */
void printCorner(Node root)
{
// star node is for keeping track of levels
Queue q = new Queue();
// pushing root node and star node
q.Enqueue(root);
// Do level order traversal of Binary Tree
while (q.Count != 0)
{
// n is the no of nodes in current Level
int n = q.Count;
for(int i = 0 ; i < n ; i++){
Node temp = q.Peek();
q.Dequeue();
//If it is leftmost corner value or rightmost corner value then print it
if(i==0||i==n-1)
Console.Write(temp.key + " ");
//push the left and right children of the temp node
if (temp.left != null)
q.Enqueue(temp.left);
if (temp.right != null)
q.Enqueue(temp.right);
}
}
}
// Driver code
public static void Main(String[] args)
{
BinaryTree tree = new BinaryTree();
tree.root = new Node(15);
tree.root.left = new Node(10);
tree.root.right = new Node(20);
tree.root.left.left = new Node(8);
tree.root.left.right = new Node(12);
tree.root.right.left = new Node(16);
tree.root.right.right = new Node(25);
tree.printCorner(tree.root);
}
}
// This code is contributed by Utkarsh Choubey
输出 :
15 10 20 8 25
时间复杂度: O(n),其中 n 是二叉树中的节点数。