给定一棵二叉树,将其打印成二维。 例如:
null
Input : Pointer to root of below tree 1 / 2 3 / / 4 5 6 7 Output : 7 3 61 5 2 4
我们强烈建议您尽量减少浏览器,并先自己尝试。 如果我们仔细观察这个模式,我们会注意到以下几点。 1) 最右边的节点打印在第一行,最左边的节点打印在最后一行。 2) 每一级的空间计数都会以固定的数量增加。 因此,我们进行反向顺序遍历(右-根-左)并打印树节点。我们在每一层都增加了固定数量的空间。 下面是实现。
C++
// C++ Program to print binary tree in 2D #include<bits/stdc++.h> using namespace std; #define COUNT 10 // A binary tree node class Node { public : int data; Node* left, *right; /* Constructor that allocates a new node with the given data and NULL left and right pointers. */ Node( int data){ this ->data = data; this ->left = NULL; this ->right = NULL; } }; // Function to print binary tree in 2D // It does reverse inorder traversal void print2DUtil(Node *root, int space) { // Base case if (root == NULL) return ; // Increase distance between levels space += COUNT; // Process right child first print2DUtil(root->right, space); // Print current node after space // count cout<<endl; for ( int i = COUNT; i < space; i++) cout<< " " ; cout<<root->data<< "" ; // Process left child print2DUtil(root->left, space); } // Wrapper over print2DUtil() void print2D(Node *root) { // Pass initial space count as 0 print2DUtil(root, 0); } // Driver code int main() { Node *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->left->left->left = new Node(8); root->left->left->right = new Node(9); root->left->right->left = new Node(10); root->left->right->right = new Node(11); root->right->left->left = new Node(12); root->right->left->right = new Node(13); root->right->right->left = new Node(14); root->right->right->right = new Node(15); print2D(root); return 0; } // This code is contributed by rathbhupendra |
C
// Program to print binary tree in 2D #include<stdio.h> #include<malloc.h> #define COUNT 10 // A binary tree node struct Node { int data; struct Node* left, *right; }; // Helper function to allocates a new node struct Node* newNode( int data) { struct Node* node = malloc ( sizeof ( struct Node)); node->data = data; node->left = node->right = NULL; return node; } // Function to print binary tree in 2D // It does reverse inorder traversal void print2DUtil( struct Node *root, int space) { // Base case if (root == NULL) return ; // Increase distance between levels space += COUNT; // Process right child first print2DUtil(root->right, space); // Print current node after space // count printf ( "" ); for ( int i = COUNT; i < space; i++) printf ( " " ); printf ( "%d" , root->data); // Process left child print2DUtil(root->left, space); } // Wrapper over print2DUtil() void print2D( struct Node *root) { // Pass initial space count as 0 print2DUtil(root, 0); } // 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->left->left->left = newNode(8); root->left->left->right = newNode(9); root->left->right->left = newNode(10); root->left->right->right = newNode(11); root->right->left->left = newNode(12); root->right->left->right = newNode(13); root->right->right->left = newNode(14); root->right->right->right = newNode(15); print2D(root); return 0; } |
JAVA
// Java Program to print binary tree in 2D class GFG { static final int COUNT = 10 ; // A binary tree node static class Node { int data; Node left, right; /* Constructor that allocates a new node with the given data and null left and right pointers. */ Node( int data) { this .data = data; this .left = null ; this .right = null ; } }; // Function to print binary tree in 2D // It does reverse inorder traversal static void print2DUtil(Node root, int space) { // Base case if (root == null ) return ; // Increase distance between levels space += COUNT; // Process right child first print2DUtil(root.right, space); // Print current node after space // count System.out.print( "" ); for ( int i = COUNT; i < space; i++) System.out.print( " " ); System.out.print(root.data + "" ); // Process left child print2DUtil(root.left, space); } // Wrapper over print2DUtil() static void print2D(Node root) { // Pass initial space count as 0 print2DUtil(root, 0 ); } // Driver code public static void main(String args[]) { Node 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.left.left.left = new Node( 8 ); root.left.left.right = new Node( 9 ); root.left.right.left = new Node( 10 ); root.left.right.right = new Node( 11 ); root.right.left.left = new Node( 12 ); root.right.left.right = new Node( 13 ); root.right.right.left = new Node( 14 ); root.right.right.right = new Node( 15 ); print2D(root); } } // This code is contributed by Arnab Kundu |
Python3
# Python3 Program to print binary tree in 2D COUNT = [ 10 ] # Binary Tree Node """ utility that allocates a newNode with the given key """ class newNode: # Construct to create a newNode def __init__( self , key): self .data = key self .left = None self .right = None # Function to print binary tree in 2D # It does reverse inorder traversal def print2DUtil(root, space) : # Base case if (root = = None ) : return # Increase distance between levels space + = COUNT[ 0 ] # Process right child first print2DUtil(root.right, space) # Print current node after space # count print () for i in range (COUNT[ 0 ], space): print (end = " " ) print (root.data) # Process left child print2DUtil(root.left, space) # Wrapper over print2DUtil() def print2D(root) : # space=[0] # Pass initial space count as 0 print2DUtil(root, 0 ) # Driver Code if __name__ = = '__main__' : 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.left.left.left = newNode( 8 ) root.left.left.right = newNode( 9 ) root.left.right.left = newNode( 10 ) root.left.right.right = newNode( 11 ) root.right.left.left = newNode( 12 ) root.right.left.right = newNode( 13 ) root.right.right.left = newNode( 14 ) root.right.right.right = newNode( 15 ) print2D(root) # This code is contributed by # Shubham Singh(SHUBHAMSINGH10) |
C#
// C# Program to print binary tree in 2D using System; class GFG { static readonly int COUNT = 10; // A binary tree node public class Node { public int data; public Node left, right; /* Constructor that allocates a new node with the given data and null left and right pointers. */ public Node( int data) { this .data = data; this .left = null ; this .right = null ; } }; // Function to print binary tree in 2D // It does reverse inorder traversal static void print2DUtil(Node root, int space) { // Base case if (root == null ) return ; // Increase distance between levels space += COUNT; // Process right child first print2DUtil(root.right, space); // Print current node after space // count Console.Write( "" ); for ( int i = COUNT; i < space; i++) Console.Write( " " ); Console.Write(root.data + "" ); // Process left child print2DUtil(root.left, space); } // Wrapper over print2DUtil() static void print2D(Node root) { // Pass initial space count as 0 print2DUtil(root, 0); } // Driver code public static void Main(String []args) { Node 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.left.left.left = new Node(8); root.left.left.right = new Node(9); root.left.right.left = new Node(10); root.left.right.right = new Node(11); root.right.left.left = new Node(12); root.right.left.right = new Node(13); root.right.right.left = new Node(14); root.right.right.right = new Node(15); print2D(root); } } // This code is contributed by Princi Singh |
Javascript
<script> // JavaScript Program to print binary tree in 2D let COUNT = 10; // A binary tree node class Node { constructor(data) { this .data = data; this .left = null ; this .right = null ; } } // Function to print binary tree in 2D // It does reverse inorder traversal function print2DUtil(root,space) { // Base case if (root == null ) return ; // Increase distance between levels space += COUNT; // Process right child first print2DUtil(root.right, space); // Print current node after space // count document.write( "<br>" ); for (let i = COUNT; i < space; i++) document.write( "  " ); document.write(root.data + "" ); // Process left child print2DUtil(root.left, space); } // Wrapper over print2DUtil() function print2D(root) { // Pass initial space count as 0 print2DUtil(root, 0); } // Driver code let 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.left.left.left = new Node(8); root.left.left.right = new Node(9); root.left.right.left = new Node(10); root.left.right.right = new Node(11); root.right.left.left = new Node(12); root.right.left.right = new Node(13); root.right.right.left = new Node(14); root.right.right.right = new Node(15); print2D(root); // This code is contributed by patel2127 </script> |
输出:
15 7 14 3 13 6 121 11 5 10 2 9 4 8
另一种使用级别顺序遍历的解决方案:
JAVA
import java.util.LinkedList; public class Tree1 { public static void main(String[] args) { Tree1.Node root = new Tree1.Node( 1 ); Tree1.Node temp = null ; temp = new Tree1.Node( 2 ); root.left=temp; temp = new Tree1.Node( 3 ); root.right=temp; temp = new Tree1.Node( 4 ); root.left.left = temp; temp= new Tree1.Node( 5 ); root.left.right =temp; temp= new Tree1.Node( 6 ); root.right.left =temp; temp= new Tree1.Node( 7 ); root.right.right = temp; temp = new Tree1.Node( 8 ); root.left.left.left = temp; temp = new Tree1.Node( 9 ); root.left.left.right = temp; temp= new Tree1.Node( 10 ); root.left.right.left = temp; temp= new Tree1.Node( 11 ); root.left.right.right = temp; temp= new Tree1.Node( 12 ); root.right.left.left = temp; temp= new Tree1.Node( 13 ); root.right.left.right = temp; temp= new Tree1.Node( 14 ); root.right.right.left = temp; temp= new Tree1.Node( 15 ); root.right.right.right = temp; printBinaryTree(root); } public static class Node{ public Node( int data){ this .data = data; } int data; Node left; Node right; } public static void printBinaryTree(Node root) { LinkedList<Node> treeLevel = new LinkedList<Node>(); treeLevel.add(root); LinkedList<Node> temp = new LinkedList<Node>(); int counter = 0 ; int height = heightOfTree(root)- 1 ; //System.out.println(height); double numberOfElements = (Math.pow( 2 , (height + 1 )) - 1 ); //System.out.println(numberOfElements); while (counter <= height) { Node removed = treeLevel.removeFirst(); if (temp.isEmpty()) { printSpace(numberOfElements / Math.pow( 2 , counter + 1 ), removed); } else { printSpace(numberOfElements / Math.pow( 2 , counter), removed); } if (removed == null ) { temp.add( null ); temp.add( null ); } else { temp.add(removed.left); temp.add(removed.right); } if (treeLevel.isEmpty()) { System.out.println( "" ); System.out.println( "" ); treeLevel = temp; temp = new LinkedList<>(); counter++; } } } public static void printSpace( double n, Node removed){ for (;n> 0 ;n--) { System.out.print( " " ); } if (removed == null ){ System.out.print( " " ); } else { System.out.print(removed.data); } } public static int heightOfTree(Node root){ if (root== null ){ return 0 ; } return 1 + Math.max(heightOfTree(root.left),heightOfTree(root.right)); } } |
输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
输出:
本文由 阿迪蒂亚·戈尔 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以写一篇文章,然后将文章邮寄给评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写评论
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END