直观的打印一颗二叉树

直观的打印一颗二叉树

在节点值两边加上特定的字符串标记来区分孩子和位置以及之间的位置关系:
HXH:表示头结点 X;vYv:表示节点 Y 是左下方最近节点的孩子;Z:表示节点 Z 是左上方最近节点的孩子
遍历树的顺序为:右子树 -> 根 -> 左子树;
避免节点值长度不同影响对其,规定每个节点值长度为固定值(这里规定为 10)

  • 最直观的打印二叉树
public class PrintBinaryTree {

    public static class Node {
        public int value;
        public Node left;
        public Node right;

        public Node(int data) {
            value = data;
        }
    }

    public static void printTree(Node head) {
        System.out.println("Binary Tree:");
        printInOrder(head, 0, "H", 10);
        System.out.println();
    }

    /**
     * @param head      :传入的节点
     * @param treeHeight:层数(根节点为 0)
     * @param to       :表示的特定节点  H表示根节点   ^表示父亲节点在左上方 v表示父亲节点在左下方
     * @param totalLength :指定每一个节点打印的宽度(总宽度)
     */
    public static void printInOrder(Node head, int treeHeight, String to, int totalLength) {
        if (head == null) {
            return;
        }
        // 递归遍历右子树
        printInOrder(head.right, treeHeight + 1, "v", totalLength);

        // 在节点值两边加上标识符
        String val = to + head.value + to;
        int valueLength = val.length();
        // 节点值左边的空格数:(总长度 - 节点值长度)/ 2
        int leftSpaceLength = (totalLength - valueLength) / 2;
        // 节点值右边的空格数
        int rightSpaceLength = totalLength - valueLength - leftSpaceLength;
        val = getSpace(leftSpaceLength) + val + getSpace(rightSpaceLength);
        // treeHeight * totalLength 为打印的节点前空格长度
        System.out.println(getSpace(treeHeight * totalLength) + val);

        // 递归遍历左子树
        printInOrder(head.left, treeHeight + 1, "^", totalLength);
    }

    public static String getSpace(int num) {
        String space = " ";
        StringBuffer buf = new StringBuffer("");
        for (int i = 0; i < num; i++) {
            buf.append(space);
        }
        return buf.toString();
    }

    public static void main(String[] args) {
        Node head = new Node(1);
        head.left = new Node(-22);
        head.right = new Node(3);
        head.left.left = new Node(2);
        head.right.left = new Node(55);
        head.right.right = new Node(66);
        head.left.left.right = new Node(7);
        printTree(head);

        head = new Node(1);
        head.left = new Node(1);
        head.right = new Node(1);
        head.left.left = new Node(1);
        head.right.left = new Node(1);
        head.right.right = new Node(1);
        head.left.left.right = new Node(1);
        printTree(head);
    }
}

程序运行结果

Binary Tree:
                       v66v   
             v3v    
                       ^55^   
   H1H    
            ^-22^   
                                 v7v    
                       ^2^   
Binary Tree:
                       v1v    
             v1v    
                       ^1^    
   H1H    
             ^1^    
                                 v1v    
                       ^1^    

注释:打印结果中, HXH表示头结点 X,VYV表示 Y 是左下方最近结点的孩子;Z 表示 Z 是左上方最近结点的孩子;

C++代码

#include<string>
#include <stdio.h> 
#include<iostream>

using namespace std;
class  Node
{
public:
	int value;
	Node* left;
	Node* right;
	Node(int data)
	{
		value = data;
	}
};
void printInOrder(Node* head, int treeHeight, string to, int totallength);
string getspace(int num);
void printtree(Node * head)
{
	printf("binnary tree\n");
	printInOrder(head, 0, "H", 10);
}

void printInOrder(Node* head, int treeHeight, string to, int totallength)
{
	if (head == NULL) { return; }
	printInOrder(head->right, treeHeight + 1, "V", totallength);
	string val = to + to_string(head->value) + to;
	int valueLength = val.length();
	int leftspaceLength = (totallength - valueLength) / 2;
	int rightspaceLength = totallength - valueLength - leftspaceLength;
	val = getspace(leftspaceLength) + val + getspace(rightspaceLength);
	cout<<getspace(treeHeight*totallength) + val+"\n";
	printInOrder(head->left, treeHeight + 1, "A", totallength);
}

string getspace(int num)
{
	string space = " ";
	string buf = "";
	for (int i = 0; i < num; i++)
		buf += space;
	return buf;
}

int main()
{
	Node* head = new Node(1);
	head->left = new Node(-22);
	head->right = new Node(3);
	head->left->left = new Node(2);
	head->right->left = new Node(55);
	head->right->right = new Node(66);
	head->left->left->right = new Node(7);
	printtree(head);
	delete(head->left->left->right);
	delete(head->right->right);
	delete(head->right->left);
	delete(head->left->left);
	delete(head->right); delete(head->left); delete(head);
	
	int a;
	cin >> a;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值