二叉树构建与遍历-LeetCode 103108109(二叉树的构建,层次遍历)

Posted 算法工程师之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树构建与遍历-LeetCode 103108109(二叉树的构建,层次遍历)相关的知识,希望对你有一定的参考价值。


重磅干货,第一时间送达

作者:TeddyZhang,公众号:算法工程师之路

二叉树遍历与构建问题:LeetCode #103 108 109

1
编程题

【LeetCode #103】二叉树的锯齿形层次遍历

二叉树构建与遍历-LeetCode 103、108、109(二叉树的构建,层次遍历)

解题思路:

这道题目依然是层次遍历的应用,与剑指Offer中的"之字形打印二叉树"是一样的,根据层次遍历的思路,可以将每一层压入到数组中,当层数为奇数的话,从而将该层的数据压入数组中,并进行反转!如果是偶数的话,则保持不变!

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */

class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        vector<vector<int>> res;
        if(!root) return res;
        queue<TreeNode*> que;
        que.push(root);
        int flag = 0;
        while(!que.empty()){
            vector<int> tmp;
            int size = que.size();
            while(size--){
                auto tt = que.front();
                que.pop();
                tmp.push_back(tt->val);
                if(tt->left)  que.push(tt->left);
                if(tt->right) que.push(tt->right);
            }
            if(flag%2 == 1){
                reverse(tmp.begin(), tmp.end());
            }
            res.push_back(tmp);
            flag++;
        }
        return res;
    }
};


来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal/

【LeetCode #108】将有序数组转换为二叉搜索树

二叉树构建与遍历-LeetCode 103、108、109(二叉树的构建,层次遍历)

解题思路:

这个思路和二分查找有些类似,由于本题目中也是有序数组,因此可以使用这种方法,因此可以将数组分割得两部分,对于BST树来说,针对于root节点,其左子树的节点必定小于root节点的值,而右子树的节点也必定大于root节点的值。从而也与有序数组的二分查找也类似!

/*
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */

class Solution {
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        return BuildBST(nums, 0, nums.size()-1);
    }

    TreeNode* BuildBST(vector<int>& nums, int l, int r){
        if(l > r)  return nullptr;
        int mid = l+(r-l)/2;
        TreeNode* root = new TreeNode(nums[mid]);
        root->left = BuildBST(nums, l, mid-1);
        root->right = BuildBST(nums, mid+1, r);
        return root;
    }
};


来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/

【LeetCode #109】有序链表转换二叉树

二叉树构建与遍历-LeetCode 103、108、109(二叉树的构建,层次遍历)

解题思路:

快慢指针的算法,首先利用快慢指针找到链表的中心点,然后截取链表,即二叉树的root节点。然后用递归的方式去构建左右子树!

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */

class Solution {
public:
    TreeNode* sortedListToBST(ListNode* head) {
        if (!head) return nullptr;
        ListNode* fast = head, *slow = head, *pre = nullptr;
        while (fast && fast->next)
        {
            pre = slow;
            fast = fast->next->next;
            slow = slow->next;
        }
        TreeNode* root = new TreeNode(slow->val);
        if (pre)
        {
            pre->next = nullptr;
            root->left = sortedListToBST(head);
            root->right = sortedListToBST(slow->next);
        }
        return root;
    }
};


来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/

2
资源分享


欢迎关注我的个人公众号 (算法工程师之路),公众号内有大量视频资料和电子书资料以及算法笔记,回复关键字即可获取!

号外,算法刷题二群已经建立,但由于邀请人数超出限制,无法扫码添加,可以加号主微信(Leopard7319538)说明来意,可以加入到算法刷题群,每天2道编程题3道概念题,我们一起坚持下去!!!

二叉树构建与遍历-LeetCode 103、108、109(二叉树的构建,层次遍历)


更多精彩推荐,请关注我们
在看点这里

以上是关于二叉树构建与遍历-LeetCode 103108109(二叉树的构建,层次遍历)的主要内容,如果未能解决你的问题,请参考以下文章

已知前序(后序)遍历序列和中序遍历序列构建二叉树(Leetcode相关题目)

leetcode105. 从前序与中序遍历序列构造二叉树

leetcode105. 从前序与中序遍历序列构造二叉树

leetcode106. 从中序与后序遍历序列构造二叉树

LeetCode---二叉树3-总结例题

LeetCode与《代码随想录》二叉树篇:做题笔记与总结-JavaScript版