数据结构——二叉树


数据结构——二叉树

二叉树的前序遍历:(来着leetcodce 144):

给你二叉树的根节点root ,返回它节点值的前序遍历。

示例1:

输入: root = [1,nu11,2,3]
输出: [1,3,2]
示例2:
输入: root = []
输出: []
示例3:
输入: root = [1]
输出: [1]
示例5:

输入: root = [1,2]
输出: [1,2]
代码:
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        postorder(root,res);
        return res;
    }

    public void postorder(TreeNode root,List<Integer> res){
        if(root == null){
            return;
        }
        res.add(root.val);
        postorder(root.left,res);
        postorder(root.right,res);
    }
}
思路:利用递归的思路:定义 preorder(root) 表示当前遍历到 root 节点的答案。

按照定义,只要首先将 root 节点的值加入答案,然后递归调用 preorder(root.left) 来遍历 root 节点的左子树,最后递归调用 preorder(root.right) 来遍历 root 节点的右子树即可,递归终止的条件为碰到空节点。

二叉树的后序遍历:(来着leetcode 145)

给你一棵二叉树的根节点root,返回其节点值的后序遍历。

示例1:

输入: root = [A,nu1l,D,E]
输出: [E,D,A]
示例2:
root = []
输出: []
示例3:
输入: root = [1]
输出: [1]

代码:

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        postorder(root,res);
        return res;
    }

    public void postorder(TreeNode root,List<Integer> res){
        if(root == null){
            return;
        }
        postorder(root.left,res);
        postorder(root.right,res);
        res.add(root.val);
    }
}
定义 postorder(root) 表示当前遍历到 root 节点的答案。

按照定义,我们只要递归调用 postorder(root->left) 来遍历 root 节点的左子树,然后递归调用 postorder(root->right) 来遍历 root 节点的右子树,最后将 root 节点的值加入答案即可,递归终止的条件为碰到空节点。

二叉树的中序遍历:(来自leetcode94)

示例1:

输入: root = [1,nu11,2,3]
输出: [1,3,2]

代码:

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<Integer>();
        inoder(root,list);
        return list;
    }
    
    public void inoder(TreeNode root,List<Integer> list){
        if(root == null){
            return;
        }
        inoder(root.left,list);    
        list. add(root.val);
        inoder(root . right,list);
    }
}
解析:中序遍历:按照访问左子树——根节点——右子树的方式遍历这棵树,inoder(root)表示当前遍历的节点,之后递归调用inoder(root.left)来遍历root节点的左子树,将root节点的值加入list,inoder(root.right)来遍历root节点的右子树。递归到空节点为止。

相同的树:

给你两棵二叉树的根节点p和q,编写一个函数来检验这两棵树是否相同。

如果两个树在结构.上相同,并且节点具有相同的值,则认为它们是相同的。

输入: p = [1,2,3], q = [1,2,3]
输出: true

输入: p = [1,2], q = [1,null,2]
输出: false

代码:

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p == null && q == null){
            return true;
        }else if(p == null|| q == null){
            return false;
        }else if(p.val != q.val){
            return false;
        }else{
            return isSameTree(p.left,q.left) && isSameTree(p. right,q. right);
    }
}
解析:本题运用递归的方法,如果两个树都为空,则返回true。如果有其中一棵树为空,则返回false。如果两个树都不为空,则进行比较,如果值不相同就返回false,如果值相同就进行递归,比较左右两颗子树。

文章作者:
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 !
  目录