LeetCode 102- 二叉树的层序遍历
题目链接:力扣
题目描述:给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
解题思路
- 使用一个队列,首先将根节点进队,然后访问后出队,再将其孩子进队,即从队列中出去的元素如果有孩子则孩子也进队。直到队列空结束。
class Solution { public: vector<vector<int>> levelOrder(TreeNode* root) { queue<TreeNode*> que; vector<vector<int>> result; if(root == NULL) return result; que.push(root); while(!que.empty()){//队列不为空就一直循环 int size = que.size();//确定每一层节点个数,方便出队操作 vector<int> tmp; for(int i=0;i<size;i++){//循环出队一层的元素 TreeNode * node = que.front(); que.pop(); tmp.push_back(node->val);//访问后如果左孩子存在就左孩子入队,右孩子也是一样 if(node->left) que.push(node->left); if(node->right) que.push(node->right); } result.push_back(tmp);//一次小循环结束,将小数组压入大数组中 } return result; } };
总结:
- 模板题,第一次见思路很牛的,那个size的处理。
LeetCode 226- 翻转二叉树
题目链接:力扣
题目描述:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
解题思路
- 前序或后序都可以,使用递归来交换每个节点的左右孩子,直到为空才结束。
class Solution { public: void trans(TreeNode *root){ if(root == NULL) return ; TreeNode *tmp = root->left; root->left = root->right; root->right = tmp; trans(root->left); trans(root->right); } TreeNode* invertTree(TreeNode* root) { if(root == NULL) return root; trans(root); return root; } };
总结:
- 递归的使用
LeetCode 101- 对称二叉树
题目链接:力扣
题目描述:给你一个二叉树的根节点 root , 检查它是否轴对称。
解题思路
- 使用递归同时遍历左右两边的树,首先确定终止条件。当左孩子为空右孩子不空,左孩子不空右孩子空,左右孩子都有但值不等时返回false,当左右孩子为空时返回true,当左右孩子都有且值相等时进入下一层递归。
class Solution { public: bool real(TreeNode *l,TreeNode *r){ if(l == NULL && r == NULL) return true;//说明左右对称了 if(l == NULL && r || l && r==NULL) return false; if(l->val != r->val) return false; return real(l->right,r->left) && real(l->left,r->right); } bool isSymmetric(TreeNode* root) { if(root == NULL) return true; return real(root->left,root->right); } };
总结:
- 需要搞懂自己用的遍历顺序是什么样的,这题是后序遍历