c++二叉树打印(只为美观)

先上效果图

二叉树效果图

然后上代码

	/**
	 * 中序遍历返回节点数组
	 * @param root 根节点
	 * @return 中序遍历节点数组
	 */
	std::vector<TreeNode *> inorderTraversal(TreeNode *root) {
   
	    std::vector<TreeNode *> res;
	    std::stack<TreeNode *> stk;
	    while (root != nullptr || !stk.empty()) {
   
	        while (root != nullptr) {
   
	            stk.push(root);
	            root = root->left;
	        }
	        root = stk.top();
	        stk.pop();
	        res.push_back(root);
	        root = root->right;
	    }
	    return res;
	}
    /**
     * 利用下划线和正反斜杠打印出美观的二叉树,没有破坏二叉树结构,但传入的root会有变化
     * @param root  二叉树根节点
     */
    void printTree(TreeNode *root) {
   
        if (!root)return;
        auto tmp = root;
        std::vector<TreeNode *> intv = inorderTraversal(tmp);//中序遍历节点数组
        std::string template_str;//模板string,表示每行打印string的长度
        int location = 0;
        std::unordered_map<TreeNode *, int> first_locations;//存储节点对应在本行string中的首位置
        for (auto &i : intv) {
   
            location = template_str.size();
            template_str += std::to_string(i->val) + " ";
            first_locations[i] = location;
        }
        for (auto &i:template_str)i = ' ';//把模板全部置为空格方便后续使用
        //层序遍历
        std::queue<TreeNode *> q;
        q.push(root);
        while (!q.empty()) {
   
            int currentLevelSize = q.size();
            int cur_loc = 0;
            std::string tmp_str1 = template_str, tmp_str2 = template_str;//1为节点所在行,2为其下一行
            for (int i = 1; i <= currentLevelSize; ++i) {
   
                auto node = q.front();
                q.pop();
                cur_loc = first_locations[node];
                std::string num_str = std::to_string(node->val);
                //左边,如果存在左孩子,那么在第二行对应位置打印
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值