打印二叉树的右视图

给定一棵二叉树,打印它的右视图。二叉树的右视图是从右侧访问树时可见的一组节点。

null
Right view of following tree is 1 3 7 8          1       /          2        3   /        /    4     5   6    7                                     8

这个问题可以通过简单的递归遍历来解决。我们可以通过向所有递归调用传递参数来跟踪节点的级别。这样做的目的是跟踪最高水平。并以访问右子树先于访问左子树的方式遍历树。每当我们看到一个节点的级别超过目前为止的最大级别时,我们都会打印该节点,因为这是其级别中的最后一个节点(请注意,我们先遍历右子树,再遍历左子树)。下面是这种方法的实现。

C++

// C++ program to print right view of Binary Tree
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int data;
struct Node *left, *right;
};
// A utility function to
// create a new Binary Tree Node
struct Node *newNode( int item)
{
struct Node *temp = ( struct Node *) malloc (
sizeof ( struct Node));
temp->data = item;
temp->left = temp->right = NULL;
return temp;
}
// Recursive function to print
// right view of a binary tree.
void rightViewUtil( struct Node *root,
int level, int *max_level)
{
// Base Case
if (root == NULL) return ;
// If this is the last Node of its level
if (*max_level < level)
{
cout << root->data << " " ;
*max_level = level;
}
// Recur for right subtree first,
// then left subtree
rightViewUtil(root->right, level + 1, max_level);
rightViewUtil(root->left, level + 1, max_level);
}
// A wrapper over rightViewUtil()
void rightView( struct Node *root)
{
int max_level = 0;
rightViewUtil(root, 1, &max_level);
}
// Driver Code
int main()
{
struct 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);
root->right->right->right = newNode(8);
rightView(root);
return 0;
}
// This code is contributed by SHUBHAMSINGH10


C

// C program to print right view of Binary Tree
#include<stdio.h>
#include<stdlib.h>
struct Node
{
int data;
struct Node *left, *right;
};
// A utility function to create a new Binary Tree Node
struct Node *newNode( int item)
{
struct Node *temp =  ( struct Node *) malloc ( sizeof ( struct Node));
temp->data = item;
temp->left = temp->right = NULL;
return temp;
}
// Recursive function to print right view of a binary tree.
void rightViewUtil( struct Node *root, int level, int *max_level)
{
// Base Case
if (root==NULL) return ;
// If this is the last Node of its level
if (*max_level < level)
{
printf ( "%d " , root->data);
*max_level = level;
}
// Recur for right subtree first, then left subtree
rightViewUtil(root->right, level+1, max_level);
rightViewUtil(root->left, level+1, max_level);
}
// A wrapper over rightViewUtil()
void rightView( struct Node *root)
{
int max_level = 0;
rightViewUtil(root, 1, &max_level);
}
// Driver Program to test above functions
int main()
{
struct 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);
root->right->left->right = newNode(8);
rightView(root);
return 0;
}


JAVA

// Java program to print right view of binary tree
// A binary tree node
class Node {
int data;
Node left, right;
Node( int item) {
data = item;
left = right = null ;
}
}
// class to access maximum level by reference
class Max_level {
int max_level;
}
class BinaryTree {
Node root;
Max_level max = new Max_level();
// Recursive function to print right view of a binary tree.
void rightViewUtil(Node node, int level, Max_level max_level) {
// Base Case
if (node == null )
return ;
// If this is the last Node of its level
if (max_level.max_level < level) {
System.out.print(node.data + " " );
max_level.max_level = level;
}
// Recur for right subtree first, then left subtree
rightViewUtil(node.right, level + 1 , max_level);
rightViewUtil(node.left, level + 1 , max_level);
}
void rightView()
{
rightView(root);
}
// A wrapper over rightViewUtil()
void rightView(Node node) {
rightViewUtil(node, 1 , max);
}
// Driver program to test the above functions
public static void main(String args[]) {
BinaryTree tree = new BinaryTree();
tree.root = new Node( 1 );
tree.root.left = new Node( 2 );
tree.root.right = new Node( 3 );
tree.root.left.left = new Node( 4 );
tree.root.left.right = new Node( 5 );
tree.root.right.left = new Node( 6 );
tree.root.right.right = new Node( 7 );
tree.root.right.left.right = new Node( 8 );
tree.rightView();
}
}
// This code has been contributed by Mayank Jaiswal


python

# Python program to print right view of Binary Tree
# A binary tree node
class Node:
# A constructor to create a new Binary tree Node
def __init__( self , item):
self .data = item
self .left = None
self .right = None
# Recursive function to print right view of Binary Tree
# used max_level as reference list ..only max_level[0]
# is helpful to us
def rightViewUtil(root, level, max_level):
# Base Case
if root is None :
return
# If this is the last node of its level
if (max_level[ 0 ] < level):
print "%d   " % (root.data),
max_level[ 0 ] = level
# Recur for right subtree first, then left subtree
rightViewUtil(root.right, level + 1 , max_level)
rightViewUtil(root.left, level + 1 , max_level)
def rightView(root):
max_level = [ 0 ]
rightViewUtil(root, 1 , max_level)
# Driver program to test above function
root = Node( 1 )
root.left = Node( 2 )
root.right = Node( 3 )
root.left.left = Node( 4 )
root.left.right = Node( 5 )
root.right.left = Node( 6 )
root.right.right = Node( 7 )
root.right.left.right = Node( 8 )
rightView(root)
# This code is contributed by Nikhil Kumar Singh(nickzuck_007)


C#

using System;
// C# program to print right view of binary tree
// A binary tree node
public class Node
{
public int data;
public Node left, right;
public Node( int item)
{
data = item;
left = right = null ;
}
}
// class to access maximum level by reference
public class Max_level
{
public int max_level;
}
public class BinaryTree
{
public Node root;
public Max_level max = new Max_level();
// Recursive function to print right view of a binary tree.
public virtual void rightViewUtil(Node node, int level,
Max_level max_level)
{
// Base Case
if (node == null )
{
return ;
}
// If this is the last Node of its level
if (max_level.max_level < level)
{
Console.Write(node.data + " " );
max_level.max_level = level;
}
// Recur for right subtree first, then left subtree
rightViewUtil(node.right, level + 1, max_level);
rightViewUtil(node.left, level + 1, max_level);
}
public virtual void rightView()
{
rightView(root);
}
// A wrapper over rightViewUtil()
public virtual void rightView(Node node)
{
rightViewUtil(node, 1, max);
}
// Driver program to test the above functions
public static void Main( string [] args)
{
BinaryTree tree = new BinaryTree();
tree.root = new Node(1);
tree.root.left = new Node(2);
tree.root.right = new Node(3);
tree.root.left.left = new Node(4);
tree.root.left.right = new Node(5);
tree.root.right.left = new Node(6);
tree.root.right.right = new Node(7);
tree.root.right.left.right = new Node(8);
tree.rightView();
}
}
// This code is contributed by Shrikant13


Javascript

<script>
// JavaScript program to print
// right view of binary tree
class Node
{
constructor(item) {
this .left = null ;
this .right = null ;
this .data = item;
}
}
let max_level = 0;
let root;
// Recursive function to print right view of a binary tree.
function rightViewUtil(node, level) {
// Base Case
if (node == null )
return ;
// If this is the last Node of its level
if (max_level < level) {
document.write(node.data + " " );
max_level = level;
}
// Recur for right subtree first, then left subtree
rightViewUtil(node.right, level + 1);
rightViewUtil(node.left, level + 1);
}
function rightView()
{
rightview(root);
}
// A wrapper over rightViewUtil()
function rightview(node) {
rightViewUtil(node, 1);
}
root = new Node(1);
root.left = new Node(2);
root.right = new Node(3);
root.left.left = new Node(4);
root.left.right = new Node(5);
root.right.left = new Node(6);
root.right.right = new Node(7);
root.right.left.right = new Node(8);
rightView();
</script>


输出

1    3    7    8    

使用队列的二叉树的右视图 时间复杂性: 该函数对树进行简单遍历,因此复杂度为O(n)。

方法2: 在这种方法中, 基于层次顺序遍历 讨论了解决方案。如果我们仔细观察,就会发现我们的主要任务是打印每个级别最右边的节点。因此,我们将在树上执行级别顺序遍历,并在每个级别打印最后一个节点。以下是上述方法的实施情况:

C++

// C++ program to print left view of
// Binary Tree
#include <bits/stdc++.h>
using namespace std;
// A Binary Tree Node
struct Node {
int data;
struct Node *left, *right;
};
// Utility function to create a new tree node
Node* newNode( int data)
{
Node* temp = new Node;
temp->data = data;
temp->left = temp->right = NULL;
return temp;
}
// function to print Right view of
// binary tree
void printRightView(Node* root)
{
if (root == NULL)
return ;
queue<Node*> q;
q.push(root);
while (!q.empty()) {
// get number of nodes for each level
int n = q.size();
// traverse all the nodes of the current level
while (n--) {
Node* x = q.front();
q.pop();
// print the last node of each level
if (n == 0) {
cout << x->data << " " ;
}
// if left child is not null push it into the
// queue
if (x->left)
q.push(x->left);
// if right child is not null push it into the
// queue
if (x->right)
q.push(x->right);
}
}
}
// Driver code
int main()
{
// Let's construct the tree as
// shown in example
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);
root->right->left->right = newNode(8);
printRightView(root);
}
// This code is contributed by
// Snehasish Dhar


Python3

# Python3 program to print right
# view of Binary Tree
from collections import deque
# A binary tree node
class Node:
# A constructor to create a new
# Binary tree Node
def __init__( self , val):
self .data = val
self .left = None
self .right = None
# Function to print Right view of
# binary tree
def rightView(root):
if root is None :
return
q = deque()
q.append(root)
while q:
# Get number of nodes for each level
n = len (q)
# Traverse all the nodes of the
# current level
while n > 0 :
n - = 1
# Get the front node in the queue
node = q.popleft()
# Print the last node of each level
if n = = 0 :
print (node.data, end = " " )
# If left child is not null push it
# into the queue
if node.left:
q.append(node.left)
# If right child is not null push
# it into the queue
if node.right:
q.append(node.right)
# Driver code
# Let's construct the tree as
# shown in example
root = Node( 1 )
root.left = Node( 2 )
root.right = Node( 3 )
root.left.left = Node( 4 )
root.left.right = Node( 5 )
root.right.left = Node( 6 )
root.right.right = Node( 7 )
root.right.left.right = Node( 8 )
rightView(root)
# This code is contributed by Pulkit Pansari


Javascript

<script>
// JavaScript program to print left view of Binary Tree
class Node
{
constructor(data) {
this .left = null ;
this .right = null ;
this .data = data;
}
}
// Utility function to create a new tree node
function newNode(data)
{
let temp = new Node(data);
return temp;
}
// function to print Right view of
// binary tree
function printRightView(root)
{
if (root == null )
return ;
let q = [];
q.push(root);
while (q.length > 0) {
// get number of nodes for each level
let n = q.length;
// traverse all the nodes of the current level
while (n-- > 0) {
let x = q[0];
q.shift();
// print the last node of each level
if (n == 0) {
document.write(x.data + " " );
}
// if left child is not null push it into the
// queue
if (x.left != null )
q.push(x.left);
// if right child is not null push it into the
// queue
if (x.right != null )
q.push(x.right);
}
}
}
// Let's construct the tree as
// shown in example
let 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);
root.right.left.right = newNode(8);
printRightView(root);
</script>


JAVA

// JAVA program to print right view of
// Binary Tree
import java.io.*;
import java.util.LinkedList;
import java.util.Queue;
// A Binary Tree Node
class Node {
int data;
Node left, right;
public Node( int d)
{
data = d;
left = right = null ;
}
}
class BinaryTree {
Node root;
// function to print Right view of
// binary tree
void rightView(Node root)
{
if (root == null ) {
return ;
}
Queue<Node> q = new LinkedList<>();
q.add(root);
while (!q.isEmpty()) {
// get number of nodes for each level
int n = q.size();
// traverse all the nodes of the current level
for ( int i = 0 ; i < n; i++) {
Node curr = q.peek();
q.remove();
// print the last node of each level
if (i == n - 1 ) {
System.out.print(curr.data);
System.out.print( " " );
}
// if left child is not null add it into
// the
// queue
if (curr.left != null ) {
q.add(curr.left);
}
// if right child is not null add it into
// the
// queue
if (curr.right != null ) {
q.add(curr.right);
}
}
}
}
// Driver code
public static void main(String[] args)
{
// Let's construct the tree as
// shown in example
BinaryTree tree = new BinaryTree();
tree.root = new Node( 1 );
tree.root.left = new Node( 2 );
tree.root.right = new Node( 3 );
tree.root.left.left = new Node( 4 );
tree.root.left.right = new Node( 5 );
tree.root.right.left = new Node( 6 );
tree.root.right.right = new Node( 7 );
tree.root.right.left.right = new Node( 8 );
tree.rightView(tree.root);
}
}
// This code is contributed by Biswajit Rajak


输出

1 3 7 8 

时间复杂性: O(n),其中n是二叉树中的节点数。

本文由 比斯瓦吉特·拉贾克 。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请发表评论

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享