【done】剑指offer——面试题60:把二叉树打印成多行

力扣,https://leetcode.cn/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof/

方案1:分行打印,使用两个LinkedList

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<List<Integer>> decorateRecord(TreeNode root) {
       List<List<Integer>> res = new ArrayList<>();
        if (Objects.isNull(root)) {
            return res;
        }
        List<TreeNode> tmp1 = new LinkedList<>();
        List<TreeNode> tmp2 = new LinkedList<>();
        List<Integer> valList = new ArrayList<>();
        tmp1.add(root);
        while (tmp1.size() > 0) {
            TreeNode topNode = tmp1.remove(0);
            valList.add(topNode.val);
            if (!Objects.isNull(topNode.left)) {
                tmp2.add(topNode.left);
            }
            if (!Objects.isNull(topNode.right)) {
                tmp2.add(topNode.right);
            }
            if (tmp1.size() == 0) {
                res.add(new ArrayList<>(valList));
                tmp1 = new ArrayList<>(tmp2);
                valList.clear();
                tmp2.clear();
            }
        }

        return res;
    }
}

##Solution1:
20180911重做。经典题目。牢记做法!

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    vector<vector<int> > Print(TreeNode* pRoot) {
        if (!pRoot) return {};
        vector<vector<int> > res;
        vector<int> tmp_vec;
        queue<TreeNode* > tree_que;
        tree_que.push(pRoot);
        int cur = 1, next = 0;
        while (!tree_que.empty()) {
            TreeNode *tmp_node = tree_que.front();
            tree_que.pop();
            cur--;
            tmp_vec.push_back(tmp_node->val);
            if (tmp_node->left) {
                tree_que.push(tmp_node->left);
                next++;
            }
            if (tmp_node->right) {
                tree_que.push(tmp_node->right);
                next++;
            }
            if (!cur) {
                res.push_back(tmp_vec);
                tmp_vec.clear();
                cur = next;
                next = 0;
            }
        }
        return res;
    }
};

其实是书上的思路
这种记录每行有几个点的方法真是hin棒棒棒啊~

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
        vector<vector<int> > Print(TreeNode* pRoot) {
            vector<vector<int> > res;
            if(pRoot == NULL)
                return res;
            vector<int> temp;
            queue<struct TreeNode*> seq_tree;
            seq_tree.push(pRoot);
            int cur = 1, next = 0;
            while(!seq_tree.empty()){
                temp.push_back(seq_tree.front()->val);
                cur--;
                if(seq_tree.front()->left != NULL) {
                    seq_tree.push(seq_tree.front()->left);
                    next++;
                }
                if(seq_tree.front()->right != NULL) {
                    seq_tree.push(seq_tree.front()->right);
                    next++;
                }
                seq_tree.pop();
                if(cur == 0) {
                    res.push_back(temp);
                    temp.clear();
                    cur = next;
                    next = 0;
                }
            }
            return res;
        }
    
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值