【算法笔记】二叉树的遍历

二叉树的前序遍历

递归法

public List<Integer> preorderTraversal(TreeNode root) {
   List<Integer> result=new ArrayList<>();
   traversal(root,result);
   return result;
}

public void traversal(TreeNode root,List<Integer> list){
   if(root==null)
       return;

   list.add(root.val);  //中
   traversal(root.left,list); //左
   traversal(root.right,list); //右

}

迭代法

使用栈解决

public List<Integer> preorderTraversal2(TreeNode root) {
    Stack<TreeNode> stack=new Stack<TreeNode>();
    List<Integer> result= new ArrayList<>();

    //结点入栈
    stack.push(root);


    while (!stack.isEmpty()){
        TreeNode node=stack.pop();
        if(node!=null) {
            result.add(node.val);   //中
        }else continue;

        //栈时先进后出,所以压入右结点
        if(node.right!=null){
            stack.push(node.right);
        }
        //再压入左结点
        if(node.left!=null){
            stack.push(node.left);
        }
    }
    return result;
}

二叉树的中序遍历

递归法

//递归法
public List<Integer> inorderTraversal(TreeNode root) {
    List<Integer> result=new ArrayList<>();
    traversal(root,result);
    return result;
}

public void traversal(TreeNode root,List<Integer> list){
    if(root==null)
        return;

    traversal(root.left,list); //左
    list.add(root.val);  //中
    traversal(root.right,list); //右

}

迭代法

使用一个pointer来访问结点,遍历到最左边,再使用栈来处理。

//迭代法
public List<Integer> inorderTraversal(TreeNode root) {
    Stack<TreeNode> stack=new Stack<TreeNode>();
    List<Integer> result= new ArrayList<>();
    //用来访问节点
    TreeNode pointer=new TreeNode();

    pointer=root;


    while(pointer!=null||!stack.isEmpty()){
        //访问到最左边的节点,依次将访问节点压入栈
        if(pointer!=null){
            stack.push(pointer);
            pointer=pointer.left;  //左
        }
        //访问到最左边节点后,开始处理节点
        else
        {
            pointer=stack.pop();
            result.add(pointer.val); //中
            pointer=pointer.right;   //右
        }
    }
    return result;

}

二叉树的后序遍历

递归法

public List<Integer> postorderTraversal(TreeNode root) {
    List<Integer> result=new ArrayList<>();
    traversal(root,result);
    return result;
}

public void traversal(TreeNode root,List<Integer> list){
    if(root==null)
        return;

    traversal(root.left,list); //左
    traversal(root.right,list); //右
    list.add(root.val);  //中
}

迭代法

前序遍历是中左右,后序是左右中,所以可调整前序代码为中右左,然后在反转就是左右中了。

//迭代法
public List<Integer> postorderTraversal2(TreeNode root) {
    Stack<TreeNode> stack=new Stack<TreeNode>();
    List<Integer> result= new ArrayList<>();

    //结点入栈
    stack.push(root);


    while (!stack.isEmpty()){
        TreeNode node=stack.pop();
        if(node!=null) {
            result.add(node.val);  //中
        }else continue;
        

        if(node.left!=null){
            stack.push(node.left);  //左
        }

        if(node.right!=null){
            stack.push(node.right); //右
        }
    }
    //反转
    Collections.reverse(result);
    return result;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值