二叉树刷题篇平衡二叉树与二叉树的所有路径

Posted 归宅观察部

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树刷题篇平衡二叉树与二叉树的所有路径相关的知识,希望对你有一定的参考价值。

110. 平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

https://leetcode-cn.com/problems/non-decreasing-array/
这道题并不难,只要一直递归就可以了。一棵树是否是平衡二叉树取决于其左右子树的深度差是否小于1,且分别为平衡二叉树。写出字面意义上的程序,与自然的思维是一致的,没有什么绕的地方。
class Solution {public: int height(TreeNode* node) { if (node == NULL) { return 0; }  else { return (max(height(node->left), height(node->right)) + 1); } }
bool isBalanced(TreeNode* root) { if (root == NULL) { return true; } else { return abs(height(root->left) - height(root->right)) <= 1 && isBalanced(root->left) && isBalanced(root->right); } }};
此题结束。



257. 二叉树的所有路径

给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。

https://leetcode-cn.com/problems/binary-tree-paths/


做这道题时,我才突然想到一个问题,根节点到每个叶子节点的路径其实是唯一的。哈哈,也许是我之前比较傻,没想过这个问题。
这题首先能够想到的思路应该是用某种方法去遍历二叉树,在达到子节点的时候记录路径。
class Solution {private:
void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) { path.push_back(cur->val); // 这才到了叶子节点 if (cur->left == NULL && cur->right == NULL) { string sPath; for (int i = 0; i < path.size() - 1; i++) { sPath += to_string(path[i]); sPath += "->"; } sPath += to_string(path[path.size() - 1]); result.push_back(sPath); return; } if (cur->left) { traversal(cur->left, path, result); path.pop_back(); // 回溯 } if (cur->right) { traversal(cur->right, path, result); path.pop_back(); // 回溯 } }
public: vector<string> binaryTreePaths(TreeNode* root) { vector<string> result; vector<int> path; if (root == NULL) return result; traversal(root, path, result); return result; }};//代码来自公众号 代码随想录 作者为Carl
其实这个思路也不需要过多介绍,与之前的遍历二叉树的代码区别并不大。
但在自己写这道题的过程中,我发现一开始我使用栈去记录已经走过的节点,实际上并不需要,使用vector一样可以实现push_back与pop_back操作,更重要的是,vector支持下标操作,这就使我们将遍历节点存入结果更加方便。

以上是关于二叉树刷题篇平衡二叉树与二叉树的所有路径的主要内容,如果未能解决你的问题,请参考以下文章

二叉树刷题篇 完全二叉树的节点个数

二叉树刷题篇

二叉树刷题篇(完) 二叉搜索树的修剪构造与转换

二叉树刷题篇(11) 二叉搜索树的最小绝对差与众数

二叉树刷题篇 最大二叉树 and 合并二叉树

学习数据结构--第四章:树与二叉树(平衡二叉树)