网站链接: element-ui dtcms
当前位置: 首页 > 技术博文  > 技术博文

二叉树的遍历

2021/6/28 16:58:27 人评论

二叉树的遍历一.深度优先1.前序遍历递归迭代2.中序遍历递归非递归3.后序遍历递归非递归二.广度优先1.层遍历一.深度优先 给定一个二叉树的根节点root, public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val …

二叉树的遍历

  • 一.深度优先
    • 1.前序遍历
      • 递归
      • 迭代
    • 2.中序遍历
      • 递归
      • 非递归
    • 3.后序遍历
      • 递归
      • 非递归
  • 二.广度优先
    • 1.层遍历

一.深度优先

给定一个二叉树的根节点root,

public class TreeNode {
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode() {}
      TreeNode(int val) { this.val = val; }
      TreeNode(int val, TreeNode left, TreeNode right) {
          this.val = val;
          this.left = left;
          this.right = right;
      }
  }

1.前序遍历

前序的规则:根结点 —> 左子树 —> 右子树。

递归

      List<Integer> list =new ArrayList<>();//答案集合
    public void preOrder(List list,TreeNode root){//前序遍历:递归。先根->左->右
      if(root==null) return ;
      list.add(root.val);
      preOrder(list,root.left);
      preOrder(list,root.right);
    }

迭代

public void preOrder(TreeNode root) {//前序遍历:迭代。先根->左->右
      Stack<TreeNode> stack =new Stack<>();
      List<Integer> list = new ArrayList<>();//答案集合
      TreeNode node =root;//记录节点压入栈中的辅助节点
       if(node!=null){
           stack.push(node);//将根节点存入栈中
           while(!stack.isEmpty()){
             node = stack.pop();
             list.add(node.val);//根节点出栈
             if(node.right!=null){//先压入右边节点(lifo)
                 stack.push(node.right);
             }  
             if(node.left!=null){
                 stack.push(node.left);
             }  
           }
       }
    }

2.中序遍历

中序遍历规则:左子树 —> 根节点—> 右子树。

递归

    List<Integer> list = new ArrayList<>();//答案集合
      public void inOrder(TreeNode root){//中序遍历:递归。先根->左->右
          if(root==null) return;
          inOrder(root.left);
          list.add(root.val);
          inOrder(root.right);
      }

非递归

public void inOrder(TreeNode root){
	        Stack<TreeNode> stack = new Stack<>();
	        List<Integer> list  = new Arraylist<>();//答案集合
	        TreeNode node =root;//记录节点压入栈中的辅助节点
	        while(node != null || !stack.empty()){
	            while (node != null){
	                stack.push(node);
	                node = node.left;
	            }
	            if(!stack.empty()){
	                node = stack.pop();//弹出左节点
	                list.add(node.val);
	                node = Node.right;//有节点
	            }
	        }
         }

3.后序遍历

后序遍历规则:左子树 —> 右子树—> 根节点。

递归

    List<Integer> list = new ArrayList<>();//答案集合
    public void postOrder(List list,TreeNode root){//后序遍历:递归。先左->右->根
        if(root==null)  return ;
        postOrder(list,root.left);
        postOrder(list,root.right);
        list.add(root.val);
    }

非递归

public void postOrder(TreeNode root){
         Stack<TreeNode> stack =new Stack<>();
		 Stack<TreeNode> stack2 =new Stack<>();
		 List<Integer> list = new ArrayList<>();//答案集合
		 TreeNode node =root;
		 while(node ! = null ||!stack.isEmpty()) {
			 while(node!=null) {
				 /*
				  * 利用两个栈在stack2中将左,右顺序压栈
				  */
				 stack.push(node);
				 stack2.push(node);
				 node=node.right;
			 }
			 if(!stack.isEmpty()) {
				 node=stack.pop();//弹出左子节点
				 node=node.left;
			 }
		 }
		 while(!stack2.isEmpty()) {
			 node=stack2.pop();
			 list.add(node.val);
		 }
	}

二.广度优先

1.层遍历

  List<List<Integer>> list =new ArrayList<>();//答案集合
  
    public void levelOrder(TreeNode root){//层序遍历
        if(root==null) return;//终止条件

		Queue<TreeNode> q =new LinkedList<>();//记录当前节点的队列
		q.offer(root);
		
        while(!q.isEmpty()) {//当队列不为空
            int  size =q. size();
            List<Integer> list1 =new ArrayList<>();//记录每层的节点元素
			
            for(int i =0;i<size;i++){//层数的元素个数,全部遍历放入list1
            TreeNode tmp =q.poll();//取出队列中的节点作为当前节点
            list1.add(tmp.val);//添加当层的节点元素
			/*
            *记录每层节点并放入队列中
            */
            if(tmp.left!=null) {
				q.offer(tmp.left);
			}
			if(tmp.right!=null) {
				q.offer(tmp.right);
			}
            }
            list.add(list1);//将每层节点放入集合中。
		}
   }

相关资讯

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?