144二叉树的前序遍历

image.png
image.png
image.png
image.png

思路

根据据条件,实现递归需要两步:
1.找出重复的子问题(递推公式)。
2.终止条件。
转换为:
(1) 找出重复的子问题
前序遍历的顺序是:根、左子树、右子树。
对于左子树或者右子树来说,也是同样的遍历顺序。
所以重复的子问题:先取根节点,再遍历左子树,最后遍历右子树。
(2) 确定终止条件
对于二叉树的遍历来说,想终止,即没东西遍历了,没东西遍历自然就停下来了。
那就是当前的节点是空的,既然是空的就没必要遍历了。

代码

  1. class Solution {
  2. public void preOrder(TreeNode root, List<Integer> res) {
  3. if (root == null) {
  4. return;
  5. }
  6. res.add(root.val);
  7. preOrder(root.left, res);
  8. preOrder(root.right, res);
  9. }
  10. public List<Integer> preorderTraversal(TreeNode root) {
  11. List<Integer> res = new ArrayList<Integer>();
  12. preOrder(root, res);
  13. return res;
  14. }
  15. }
  1. # Definition for a binary tree node.
  2. # class TreeNode:
  3. # def __init__(self, val=0, left=None, right=None):
  4. # self.val = val
  5. # self.left = left
  6. # self.right = right
  7. class Solution:
  8. def preOrder(self, root: TreeNode, res):
  9. if root == None:
  10. return
  11. res.append(root.val)
  12. self.preOrder(root.left, res)
  13. self.preOrder(root.right, res)
  14. def preorderTraversal(self, root: TreeNode) -> List[int]:
  15. res = []
  16. self.preOrder(root, res)
  17. return res

94二叉树的中序遍历

image.png
image.png

思路

中序遍历,按照 左-打印-右这种顺序遍历树即可
递归函数实现
终止条件:当前节点为空时
函数内:递归的调用左节点,打印当前节点,再递归调用右节点

代码

  1. class Solution {
  2. public List<Integer> inorderTraversal(TreeNode root) {
  3. List<Integer> res = new ArrayList<Integer>();
  4. dfs(res,root);
  5. return res;
  6. }
  7. void dfs(List<Integer> res, TreeNode root) {
  8. if(root==null) {
  9. return;
  10. }
  11. dfs(res,root.left);
  12. res.add(root.val);
  13. dfs(res,root.right);
  14. }
  15. }
  1. class Solution(object):
  2. def inorderTraversal(self, root):
  3. """
  4. :type root: TreeNode
  5. :rtype: List[int]
  6. """
  7. res = []
  8. def dfs(root):
  9. if not root:
  10. return
  11. dfs(root.left)
  12. res.append(root.val)
  13. dfs(root.right)
  14. dfs(root)
  15. return res

145二叉树的后序遍历

image.png
image.png

思路

后序遍历:左、右、根,对于左子树、右子树来说,也是同样的遍历顺序。
重复子问题就:先遍历左子树、再遍历右子树、再取根节点。
终止条件:当前节点为空,没啥好遍历的。

代码

  1. class Solution {
  2. public void postorder(TreeNode root, List<Integer> res) {
  3. if (root == null) {
  4. return;
  5. }
  6. postorder(root.left, res);
  7. postorder(root.right, res);
  8. res.add(root.val);
  9. }
  10. public List<Integer> postorderTraversal(TreeNode root) {
  11. List<Integer> res = new ArrayList<Integer>();
  12. postorder(root, res);
  13. return res;
  14. }
  15. }
  1. # Definition for a binary tree node.
  2. # class TreeNode:
  3. # def __init__(self, val=0, left=None, right=None):
  4. # self.val = val
  5. # self.left = left
  6. # self.right = right
  7. class Solution:
  8. def postOrder(self, root: TreeNode, res):
  9. if root == None:
  10. return
  11. self.postOrder(root.left, res)
  12. self.postOrder(root.right, res)
  13. res.append(root.val)
  14. def postorderTraversal(self, root: TreeNode) -> List[int]:
  15. res = []
  16. self.postOrder(root, res)
  17. return res