day14主要使用递归法遍历解决一些二叉树的简单问题,按照递归三个步骤进行思考,返回值通过答案的类型进行考虑,终止条件需要结合题意进行,单层递归逻辑可以通过画图进行确定。
leetcode 226反转二叉树
本题前序遍历和后序遍历都可,如果采用中序遍历,在遍历完左子树后经过反转,左子树变为右子树,接下来遍历右子树相当于又遍历了一遍已经遍历过的前左子树,因此不能采用中序遍历
void Traversal(TreeNode*root,vector<int>vec){if(root==nullptr)return ;vec.push_back(root->val);swap(root->left,root->right);Traversal(root->left,vec);Traversal(root->right,vec);}
leetcode 101 对称二叉树
判断二叉树是否对称,就是看左右两棵子树的外侧、里侧是否分别相等,由于需要将两个子树高度返回给根节点,因此需要先遍历左右子节点,采用后序遍历。由于需要分别对比外侧与里侧的值,因此左子树采用的是左右中,而右子树相应的采用右左中。
bool compare(TreeNode*left,TreeNode*right){if(left==nullptr&&right!=nullptr)return false;else if(left!=nullptr&&right==nullptr)return false;else if(left==nullptr&&right==nullptr)return true;else if(left->val!=right->val)return false;bool outside=compare(left->left,right->right);//左子树:左 || 右子树:右bool inside=compare(left->right,right->left);//左子树:右 || 右子树:左bool isSame=outside&&inside;//左子树:中 || 右子树:中 处理逻辑return isSame;}
leetcode 104 二叉树的最大深度
采用后序遍历,将两个子树最大值加1就是根节点的深度
int getHeight(TreeNode*root){if(root==nullptr)return 0;int leftHeight=getHeight(root->left);int rightHeight=getHeight(root->right);int height=1+max(leftHeight,rightHeight);return height;}
leetcode 111 二叉树的最小深度
采用后序遍历,将两个子树最小高度加1,但是需要考虑到题目中对于叶子节点的说明,叶子节点是指没有子节点的节点,因此只有左右其中一个节点的情况不能算,因此需要判断排除。
int getHeight(TreeNode*root){if(root==nullptr)return 0;int leftH=getHeight(root->left);int rightH=getHeight(root->right);if(root->left==nullptr&&root->right!=nullptr){return 1+rightH;}else if(root->left!=nullptr&&root->right==nullptr){return 1+leftH;}return 1+min(leftH,rightH);}
