代码随想录算法训练营day13

您所在的位置:网站首页 java遍历二叉树代码 代码随想录算法训练营day13

代码随想录算法训练营day13

2023-07-01 18:26| 来源: 网络整理| 查看: 265

代码随想录算法训练营day13| 二叉树层序遍历 226 翻转二叉树 101 对称二叉树 二叉树的层序遍历 LeetCode 102 二叉树的层序遍历 题目链接: 102. 二叉树的层序遍历 class Solution { public: vector levelOrder(TreeNode* root) { queue que; if(root != NULL) que.push(root); vector result; while(!que.empty()) { int size = que.size(); vector vec; //此处需要固定size大小,que.size()是不断变化的 for(int i = 0; i public: void order(TreeNode* cur, vector& result, int depth) { if(cur == nullptr) return; if(result.size() == depth) result.push_back(vector()); //递归终止条件 result[depth].push_back(cur->val); order(cur->left, result, depth+1); order(cur->right, result, depth+1); } vector levelOrder(TreeNode* root) { vector result; int depth = 0; order(root, result, depth); return result; } };

本题小结:层序遍历有两种方式,一种是利用队列先进先出的方式对每层进行遍历,第二种是递归法。

LeetCode 226 翻转二叉树 题目链接: 226.翻转二叉树 class Solution{ public: TreeNode* invertTree(TressNode* root) { //确定递归函数参数和返回值 if(root == NULL) return root; //确定中止条件 //确定单层递归逻辑(此处为前序遍历) swap(root->left, root->right); //中 invertTree(root->left); //左 invertTree(root->right); //右 return root; } };

本题小结:此题需要注意在翻转遍历顺序的时候需要注意不能采用中序遍历,因为可能会因为交换导致一边节点顺序没更换,另一边更换了两次。

LeetCode 101 对称二叉树 题目链接: 101. 对称二叉树 class Solution{ public: bool compare(TreeNode* left, TreeNode* right) { //确定递归函数参数和返回值 //首先讨论为空指针的三种情况 if(left == NULL && right != NULL) return false; else if(left != NULL && right == NULL) return false; else if(left == NULL && right == NULL) return true; //然后考虑左右子树结点不同的情况 else if(left->val != right->val) return false; //剩下的即为相同的情况 bool outside = compare(left->left, right->right); //左子树:左 vs 右子树:右 bool inside = compare(left->right, right->left); //左子树:右 vs 右子树: 左 bool isSame = outside && compare; return isSame; } };

本题小结:此题的意思是判断根节点的左右子树,需要同时遍历两棵树,且遍历顺序只能是后序遍历,因为涉及到遍历过程中需要判断左子树的“左右中”和右子树的“右左中”是否相同。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3