https://juejin.im/post/5b8d64346fb9a01a1d4f99fa
翻转二叉树
leetcode226
- 执行用时 :4 ms, 在所有 C++ 提交中击败了82.02%的用户
内存消耗 :9.1 MB, 在所有 C++ 提交中击败了54.58%的用户
思路:先画图自己反转一颗二叉树,看下反转规律,前序遍历树中结点,对对于每个结点做如下操作:结点有孩子,左右互换;结点为空或者没有孩子,不用反转,直接返回该节点;TreeNode* invertTree(TreeNode* root) { if(root==nullptr) return root; if(root->left==nullptr && root->right==nullptr) return root; TreeNode* node=root->left; root->left=root->right; root->right=node; invertTree(root->left); invertTree(root->right); return root; }
- 剑指offer
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
思路:后序遍历特点:左右根,二叉搜索树特点:左子树节点小于根节点,根节点小于右子树节点。bool Judge(vector<int> vec){ if(vec.empty()){ return true; } int lo=0,hi=vec.size()-1; return help(vec,lo,hi); } bool help(vecotr<int> vec,int lo,int hi){ if(lo>=hi) return true; int root=vec[hi]; int mid=lo; while(mid<hi && vec[mid]<root){//左子树[lo,mid-1] ++mid; } for(int i=mid;i<=hi;++i){//右子树[mid,hi] if(vec[i]<=root){ break; return false; } } reutrn help(vec,lo,mid-1)&&help(vec,mid,hi); }
-
打印二叉树路径和等于某个值的路径上所有结点的数据
leetcode113执行用时 :36 ms, 在所有 C++ 提交中击败了36.04%的用户
内存消耗 :33.7 MB, 在所有 C++ 提交中击败了31.11%的用户
思路:肯定是要遍历树的,遍历树有:前序/中序/后序/层次/深度,选择前序遍历是合适的,因为先遍历根节点,再判断存储数据的条件是:当前已经遍历到叶子结点,而且路径和等于sum。public: vector<vector<int>> pathSum(TreeNode* root, int sum) { vector<vector<int> >result; vector<int> vec; if(root==nullptr) return result; int count=0; preorder(root,result,vec,count,sum); return result; } private: void preorder(TreeNode* root,vector<vector<int> >&result,vector<int>vec,int count,int sum){ count+=root->val; vec.push_back(root->val); if(count==sum && root->left==nullptr && root->right==nullptr){ result.push_back(vec); return; } if(root->left){ preorder(root->left,result,vec,count,sum); } if(root->right){ preorder(root->right,result,vec,count,sum); } }
-
二叉树路径总和
执行用时 :24 ms, 在所有 C++ 提交中击败了35.14%的用户
内存消耗 :19.8 MB, 在所有 C++ 提交中击败了42.70%的用户
思路:同样是跟前序遍历结合,只是不需要存储数据,加上一个bool变量记录即可。public: bool hasPathSum(TreeNode* root, int sum) { if(root==nullptr) return false; int result=0; bool flag=false; preorder(root,result,sum,flag); return flag; } private: void preorder(TreeNode* root,int result, int sum,bool &flag){ result+=root->val; if(result==sum && root->left==nullptr && root->right==nullptr){ flag=true; return; } if(root->left) preorder(root->left,result,sum,flag); if(root->right) preorder(root->right,result,sum,flag); }