二叉树构建与遍历-LeetCode 103108109(二叉树的构建,层次遍历)
Posted 算法工程师之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树构建与遍历-LeetCode 103108109(二叉树的构建,层次遍历)相关的知识,希望对你有一定的参考价值。
重磅干货,第一时间送达
作者:TeddyZhang,公众号:算法工程师之路
二叉树遍历与构建问题:LeetCode #103 108 109
【LeetCode #103】二叉树的锯齿形层次遍历
解题思路:
这道题目依然是层次遍历的应用,与剑指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】将有序数组转换为二叉搜索树
解题思路:
这个思路和二分查找有些类似,由于本题目中也是有序数组,因此可以使用这种方法,因此可以将数组分割得两部分,对于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】有序链表转换二叉树
解题思路:
快慢指针的算法,首先利用快慢指针找到链表的中心点,然后截取链表,即二叉树的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/
欢迎关注我的个人公众号 (算法工程师之路),公众号内有大量视频资料和电子书资料以及算法笔记,回复关键字即可获取!
号外,算法刷题二群已经建立,但由于邀请人数超出限制,无法扫码添加,可以加号主微信(Leopard7319538)说明来意,可以加入到算法刷题群,每天2道编程题3道概念题,我们一起坚持下去!!!
完
以上是关于二叉树构建与遍历-LeetCode 103108109(二叉树的构建,层次遍历)的主要内容,如果未能解决你的问题,请参考以下文章