代码随想录(二叉树)

二叉树的递归遍历

java 复制代码
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
		List<Integer> list = new ArrayList<>();
		if(root==null) {
			return list;
		}else {
			traversal(list,root);
		}
        return list;
	}
	public void traversal(List<Integer> list,TreeNode root) {
		if(root==null) {
			return;
		}
        //前中后序调整一下下面的顺序即可
		list.add(root.val);
		traversal(list,root.left);
		traversal(list,root.right);
	}
}

二叉树的迭代遍历

java 复制代码
思路 以中序为扩展,其他的改变顺序即可  中序---左中右  栈---右中左

1、先入栈根结点

2、弹出第一个,因为我们每次先拿到的都是子树的中结点

3、右结点入栈  中结点入栈并打上标记null  左结点入栈  

4、遇见null结点则弹出两次 第二次的值入列表
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        Deque<TreeNode> de = new LinkedList<>();
        if(root==null){
            return list;
        }else{
            de.addLast(root);
        }
        while(!de.isEmpty()){
            TreeNode node = de.peekLast();
            if(node!=null){  
                de.pollLast();
                if(node.right!=null){  //右
                    de.addLast(node.right);
                }
                de.addLast(node);  //中
                de.addLast(null);
                if(node.left!=null){ //左
                    de.addLast(node.left);
                }
            }else{
                de.pollLast();
                node = de.peekLast();
                de.pollLast();
                list.add(node.val);
            }
        }
        return list;
    }
}

二叉数的层序遍历(Leetcode102)

java 复制代码
思路

1、根结点入队  用int size = de.size() 可以了解到这一层有几个结点

2、每层遍历到的结点考虑他的左右结点,如果有结点则入队 先左后右

3、这一层遍历到的size个结点加入到arr中 这一层遍历完后再加入到list中
public List<List<Integer>> levelOrder(TreeNode root) {
		List<List<Integer>> list = new ArrayList<>();
		Deque<TreeNode> de = new LinkedList<>();
		if(root==null) {
			return list;
		}else {
			de.add(root);
		}
		while(!de.isEmpty()) {
			int size = de.size();
			List<Integer> arr = new ArrayList<>();
			for(int i = 0;i<size;i++) { 
				TreeNode temp = de.pollFirst();
				if(temp.left!=null) {
					de.addLast(temp.left);
				}
				if(temp.right!=null) {
					de.addLast(temp.right);
				}
				arr.add(temp.val);
			}
			list.add(arr);
		}
		return list;
	}

二叉树的层序遍历2(Leetcode107)

java 复制代码
思路 先层序遍历 再把顺序颠倒一下即可  Collections.reverse(list); 可以改变集合顺序
public List<List<Integer>> levelOrderBottom(TreeNode root) {
		List<List<Integer>> list = new ArrayList<>();
		Deque<TreeNode> de = new LinkedList<>();
		if(root==null) {
			return list;
		}else {
			de.add(root);
		}
		while(!de.isEmpty()) {
			int size = de.size();
			List<Integer> arr = new ArrayList<>();
			while(size-->0) {
				TreeNode temp = de.pollFirst();
				if(temp.left!=null) {
					de.add(temp.left);
				}
				if(temp.right!=null) {
					de.add(temp.right);
				}
				arr.add(temp.val);
			}
			list.add(arr);
		}
		Collections.reverse(list);
		return list;
    }

二叉树的右视图(Leetcode199)

java 复制代码
思路:每次把每一层最后一个结点的值加入列表即可 也是层序
public List<Integer> rightSideView(TreeNode root) {
		List<Integer> list = new ArrayList<>();
		Deque<TreeNode> de = new LinkedList<>();
		if(root==null) {
			return list;
		}else {
			de.add(root);
		}
		while(!de.isEmpty()) {
			int size = de.size();
			for(int i = 0;i<size;i++) {
				TreeNode temp = de.pollFirst();
				if(i==(size-1)){  //判断是不是当前层最后一个结点
					list.add(temp.val);
				}
				if(temp.left!=null) {
					de.addLast(temp.left);
				}
				if(temp.right!=null) {
					de.addLast(temp.right);
				}
				
			}
		}
		return list;
	}

二叉树的层平均值(Leetcode637)

java 复制代码
class Solution {
       public List<Double> averageOfLevels(TreeNode root) {
		List<Double> result = new LinkedList<>();
		Deque<TreeNode> de = new LinkedList<>();
		if(root==null) {
			return result;
		}
		de.add(root);
        while(!de.isEmpty()){
            int size = de.size();
            int sum = size;
            double num = 0;
            while(size-->0){
                TreeNode temp = de.pollFirst();
                num += temp.val;
                if(temp.left!=null){
                   de.addLast(temp.left);
               }
               if(temp.right!=null){
                   de.addLast(temp.right);
               }
            }
            double total = num/sum;
            result.add(total);
        }
		return result;
}
}

N叉树的层序遍历(Leetcode429)

java 复制代码
class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        List<List<Integer>> result = new LinkedList<>();
        Deque<Node> de = new LinkedList<>();
        if(root == null) {
        	return result;
        }
        de.add(root);
        while(!de.isEmpty()) {
        	int size = de.size();
        	List<Integer> list = new LinkedList<>();
        	while(size-->0){
                Node temp = de.pollFirst();
                list.add(temp.val);
                if(temp.children!=null){  //判断是不是有子结点,有的话全部入队
                    for(int i = 0;i<temp.children.size();i++){
                        de.addLast(temp.children.get(i));
                    }
                }
        }
        result.add(list);
        }
        return result;
        
        
    }
}

每个树行中找最大值(Leetcode515)

java 复制代码
class Solution {
     public List<Integer> largestValues(TreeNode root) {
        List<Integer> result = new LinkedList<>();
        Deque<TreeNode> de = new LinkedList<>();
        if(root==null) {
        	return result;
        }
        de.add(root);
        while(!de.isEmpty()){
            int size = de.size();
            int max = Integer.MIN_VALUE;
            while(size-->0){
                TreeNode temp = de.pollFirst();
                max = max>temp.val?max:temp.val; //判断是不是当前层最大的
                 if(temp.left!=null){
                   de.addLast(temp.left);
               }
               if(temp.right!=null){
                   de.addLast(temp.right);
               }
            }
            result.add(max);
        }
        return result;
   }
}

填充每个节点的下一个右侧节点(Leetcode116/117)

java 复制代码
思路

1、一先创建一个虚拟指针指向root ,用这个指针来操控即可,就不会影响影响到root

2、层序遍历

3、判断每层的最后一个都指向null 前面的按照队列顺序指向
public Node connect(Node root) {
	     Deque<Node> de = new LinkedList<>();
	     if(root==null) {
	    	 return root;
	     }else {
	    	 Node cur = root;
	    	 de.add(cur);
	     }
	     while(!de.isEmpty()) {
	    	 int size = de.size();
	    	 for(int i = 0;i<size;i++) {
	    		 Node temp = de.pollFirst();
	    		 if(!de.isEmpty()&&de.peekFirst()!=null&&i!=(size-1)) { //除了最后一个节点外 弹出的指向弹出后的队首
	    			 temp.next = de.peekFirst();
	    		 }else {
	    			 temp.next = null;
	    		 }
	    		 if(temp.left!=null) {
	    			 de.addLast(temp.left);
	    		 }
	    		 if(temp.right!=null) {
	    			 de.addLast(temp.right);
	    		 }
	    		
	    	 }
	     }
	     return root;
	}

翻转二叉树(Leetcode226)

java 复制代码
思路

1、定义一个函数来交换左右节点

2、遍历节点,每遍历一个节点交换一次
class Solution {
public TreeNode invertTree(TreeNode root) {
		Deque<TreeNode> de = new LinkedList<>();
		if(root==null) {
			return root;
		}else {
			de.add(root);
		}
		while(!de.isEmpty()) {
			int size = de.size();
			for(int i = 0;i<size;i++) {
				TreeNode temp = de.pollFirst();
				if(temp.left!=null) {
					de.addLast(temp.left);
				}
				if(temp.right!=null) {
					de.addLast(temp.right);
				}
				SwapNode(temp);
			}
		}
		return root;
	}
	public void SwapNode(TreeNode root) {
		TreeNode temp = root.left;
		root.left = root.right;
		root.right = temp;
	}
}

对称二叉树(Leetcode101)

java 复制代码
思路:

1、根节点的左右节点入队

2、每次判断左右节点的外侧和内侧节点是否相同

3、左右节点的内外侧节点入队
public boolean isSymmetric(TreeNode root) {
		Deque<TreeNode> de = new LinkedList<>();
        if(root==null){
            return true;
        }else {
			de.add(root.left);
			de.add(root.right);
		}
		while(!de.isEmpty()) {
			TreeNode node1 = de.pollFirst();
			TreeNode node2 = de.pollFirst();
			if(node1==null&&node2!=null) {
				return false;
			}
			if(node2==null&&node1!=null) {
				return false;
			}
            if(node1==null&&node2==null){
                continue;
            }
			if(node1.val!=node2.val) {
				return false;
			}
			de.add(node1.left);
			de.add(node2.right);
			de.add(node1.right);
			de.add(node2.left);
		}
		return true;
    }

二叉树的最大深度(Leetcode104)

java 复制代码
思路:直接层序遍历,层数就是它的最大深度 后序遍历求的是高度
public int maxDepth(TreeNode root) {
		Deque<TreeNode> de = new LinkedList<>();
		if(root==null) {
			return 0;
		}else {
			de.add(root);
		}
		int count = 0;
		while(!de.isEmpty()) {
			int size = de.size();
			count++;
			while(size-->0) {
				TreeNode temp = de.pollFirst();
				if(temp.left!=null) {
					de.add(temp.left);
				}
				if(temp.right!=null) {
					de.add(temp.right);
				}
			}
		}
		return count;
	}

二叉数的最小深度(Leetcode111)

java 复制代码
思路2 层序,从左到右,先遍历到的叶子节点所处的层就是最小深度 可以自己画图理解一下
class Solution {
    public int minDepth(TreeNode root) {
        if(root==null) return 0;
      Deque<TreeNode> queue = new LinkedList<>();
      queue.add(root);
      int depth = 1;
      while(!queue.isEmpty()){
        int size = queue.size();
        for(int i=0;i<size;i++){
             TreeNode node = queue.remove();
            if(node.left == null&&node.right == null)       {     
                return depth;
            }
            if(node.left!=null){
                queue.add(node.left);
            }
            if(node.right!=null){
                queue.add(node.right);
            }
        }
        depth++;
      }
      return -1;
    }
}

完全二叉数的节点数 (Leetcode222)

java 复制代码
public static  int countNodes(TreeNode root) {
		if(root==null) {
			return 0;
		}
		
		return traveral(root);
    }
	public static  int traveral(TreeNode root) {
		if(root==null) {
			return 0;
		}
		int left = traveral(root.left);
		int right = traveral(root.right);
		return left+right+1;
	}
相关推荐
非凡ghost1 天前
猫眼浏览器(Chrome内核增强版浏览器)官方便携版
前端·网络·chrome·windows·软件需求
熊文豪2 天前
Windows安装RabbitMQ保姆级教程
windows·分布式·rabbitmq·安装rabbitmq
搬砖的小码农_Sky2 天前
Windows操作系统上`ping`命令的用法详解
运维·网络·windows
Kiri霧2 天前
Rust模式匹配详解
开发语言·windows·rust
程序设计实验室2 天前
使用命令行删除 Windows 网络映射驱动器
windows
用户31187945592182 天前
Windows 电脑安装 XTerminal 1.25.1 x64 版(带安装包下载关键词)
windows
Logintern092 天前
windows如何设置mongodb的副本集
数据库·windows·mongodb
Chandler242 天前
一图掌握 操作系统 核心要点
linux·windows·后端·系统
ajassi20002 天前
开源 C# 快速开发(十七)进程--消息队列MSMQ
windows·开源·c#
Python私教2 天前
5分钟上手 MongoDB:从零安装到第一条数据插入(Windows / macOS / Linux 全平台图解)
windows·mongodb·macos