226.翻转二叉树
根节点可以交换左右指针,其他层逻辑不清楚,觉得应该不是简单的交换指针。
从下到上,依次交换节点的左右指针即可,关键在于选择遍历顺序,可以选择前序遍历和后序遍历,后续遍历(左右中,右左中)是先处理下层节点再处理当前层节点,处理每个节点都是执行一个交换指针操作。
交换指针的逻辑,javascript交换指针函数需要传递root,不能改变root.left和root.right的值达到交换指针的效果。
4.用了一个小时左右。
对称二叉树
根节点可以比较左右指针,其他层如何比较不知道。
2. 以根节点的子节点leftnode,rightnode这一层为例,首先判断leftnode,rightnode是否为空,leftnode和rightnode都为空,满足对称返回true, leftnode,rightnode其中一个为空则返回false,如果leftnode,rightnode都不为空则判断leftnode,rightnode两个节点的值是否相等,不相等则返回false,相等则继续递归比较leftnode.left和rightnode.right是否想等,leftnode.right和rightnode.left是否相等。如果这两次判断都为true,则结果为true,否则结果为false。递归结束条件为当前遍历节点为空。
3. 以根节点的子节点leftnode,rightnode这一层为例,首先判断leftnode,rightnode是否为空,leftnode和rightnode都为空,满足对称返回true, leftnode,rightnode其中一个为空则返回false,如果leftnode,rightnode都不为空则判断leftnode,rightnode两个节点的值是否相等,不相等则返回false,相等则继续递归比较leftnode.left和rightnode.right是否想等,leftnode.right和rightnode.left是否相等。如果这两次判断都为true,则结果为true,否则结果为false。递归结束条件为当前遍历节点为空。
- 用了一个小时左右。
104.二叉树的最大深度
只想到了层序遍历可以计算深度。
根节点的最大高度就是二叉树的最大深度,二叉树要求高度,通过后序遍历(即左右中)往上计算,叶子节点的高度为1,对于左右中的遍历顺序来说,中节点的最大深度高度为左右子节点高度中的最大值+1,递归结束条件为遍历节点为空,此时高度为0。
3. 根节点的最大高度就是二叉树的最大深度,二叉树要求高度,通过后序遍历(即左右中)往上计算,叶子节点的高度为1,对于左右中的遍历顺序来说,中节点的最大深度高度为左右子节点高度中的最大值+1,递归结束条件为遍历节点为空,此时高度为0。
- 用了一个小时左右。
111.二叉树的最小深度
只想到了层序遍历可以计算深度。
同样可以转换为计算二叉树的最小高度,采用左右中的遍历顺序,注意二叉树最小深度的定义,是从根节点到叶子节点的长度,不是空节点,所以需要添加判断条件 — 当左子树为空有子树为空时返回右子树的高度+1;当左子树不为空右子树为空时,返回左子树的高度+1;当左右子树都为空时,说明此时为叶子节点,高度为1;当左右子树都不为空时,分别计算左右子树的高度,取最小值再+1即为中节点对应高度;递归结束条件为当前节点为空。
3. 当左子树为空有子树为空时返回右子树的高度+1;当左子树不为空右子树为空时,返回左子树的高度+1。
- 用了一个小时左右。