LeetCode ACM模式——二叉树篇(一)

这篇具有很好参考价值的文章主要介绍了LeetCode ACM模式——二叉树篇(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com 

目录

定义二叉树

创建二叉树

利用前序遍历创建二叉树

利用数组创建二叉树

打印二叉树

144. 二叉树的前序遍历

递归遍历

迭代遍历(利用栈)

145. 二叉树的后序遍历

​编辑递归遍历

迭代遍历(利用栈)

94. 二叉树的中序遍历 

递归遍历

迭代遍历(利用栈)

定义二叉树

public class TreeNode {
	int val;
	TreeNode left;
	TreeNode right;

	public TreeNode() {
	}

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


}

创建二叉树

利用前序遍历创建二叉树

/**
 * @author light
 * @Description 基于前序遍历创建二叉树
 * @create 2023-08-13 20:24
 */
public class BinaryTree {
	TreeNode root; //根节点
	int size;  //树的长度
	int index=0;

    //Integer[] data:数值数组
	public BinaryTree(Integer[] data) {
		this.size=getSize(data);
		root=createTree(data);
	}

	private int getSize(Integer[] data) {
		int size=0;
		for(Integer i:data){
			if(i!=null){
				size++;
			}
		}
		return size;
	}

	public TreeNode createTree(Integer[] data){//递归生成二叉树
		Integer val=data[index++];
		if(val==null){
			return null;
		}
		TreeNode node=new TreeNode(val);
		node.left=createTree(data);
		node.right=createTree(data);
		return node;
	}
}

利用数组创建二叉树

/**
 * @author light
 * @Description 利用数组创建二叉树
 * @create 2023-08-14 12:38
 */
public class BinaryTree2 {
	TreeNode root; //根节点
	int size;  //树的长度
	Integer[] data;

	public BinaryTree2(Integer[] data) {
		this.data=data;
		this.size=getSize(data);
		root=createTree(0);
	}

	private int getSize(Integer[] data) {
		int size=0;
		for(Integer i:data){
			if(i!=null){
				size++;
			}
		}
		return size;
	}
	private TreeNode createTree(int index) {
		if(index>=data.length){
			return null;
		}
		if(data[index]==null){
			return null;
		}
		TreeNode node=new TreeNode(data[index]);
		node.left=createTree(2*index+1);
		node.right=createTree(2*index+2);
		return node;

	}

}

打印二叉树

/**
 * @author light
 * @Description 打印二叉树
 * @create 2023-08-14 13:06
 */
public class BinaryTreePrinter {
	public static void printTree(TreeNode root) {
		printTree(root, 0);
	}

	private static void printTree(TreeNode node, int level) {
		if (node == null) {
			return;
		}
		System.out.print(node.val+"\t");
		printTree(node.left, level + 1);
		printTree(node.right, level + 1);
	}

	public static void main(String[] args) {
		// 创建一个二叉树
		TreeNode root = new TreeNode(1);
		root.left = new TreeNode(2);
		root.right = new TreeNode(3);
		root.left.left = new TreeNode(4);
		root.left.right = new TreeNode(5);
		root.right.left = new TreeNode(6);
		root.right.right = new TreeNode(7);

		// 打印二叉树
		printTree(root);
	}

}

LeetCode ACM模式——二叉树篇(一),做题总结,leetcode,算法,BinaryTree,java

144. 二叉树的前序遍历

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

LeetCode ACM模式——二叉树篇(一),做题总结,leetcode,算法,BinaryTree,java

递归遍历



import java.util.ArrayList;
import java.util.List;

/**
 * @author light
 * @Description 二叉树的前序遍历
 * @create 2023-08-13 19:43
 */
public class PreorderTraversalTest {
	public static void main(String[] args) {
		Integer[] data={1, 2, 4, null, null, 5, null, null, 3, null, null };

		BinaryTree tree=new BinaryTree(data);
		System.out.println("递归前序遍历:");
		List<Integer> res1=preorderTraversal_Recursion(tree.root);
		System.out.println(res1);

	}

	//递归遍历
	public static List<Integer> preorderTraversal_Recursion(TreeNode root) {
		List<Integer> res=new ArrayList<>();
		traversal(root,res);
		return res;
	}
	public static void traversal(TreeNode root,List<Integer> res){
		if(root==null){
			return ;
		}
		res.add(root.val); //中
		traversal(root.left,res); //左
		traversal(root.right,res); //右

	}
	
}

迭代遍历(利用栈)


import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;

/**
 * @author light
 * @Description 二叉树的前序遍历
 * @create 2023-08-13 19:43
 */
public class PreorderTraversalTest {
	public static void main(String[] args) {
		Integer[] data={1, 2, 4, null, null, 5, null, null, 3, null, null };

		BinaryTree tree=new BinaryTree(data);
		System.out.println("迭代前序遍历");
		List<Integer> res2=preorderTraversal_Iterate(tree.root);
		System.out.println(res2);

	}

	//迭代遍历(利用栈:前序遍历顺序:中-左-右,入栈顺序:中-右-左
	public static List<Integer> preorderTraversal_Iterate(TreeNode root) {
		List<Integer> list=new ArrayList<>();
		Deque<TreeNode> stack=new ArrayDeque<>();
		if(root==null){
			return list;
		}
		stack.push(root);
		while(!stack.isEmpty()){
			TreeNode node=stack.pop();
			list.add(node.val);
			if(node.right!=null){
				stack.push(node.right);
			}
			if(node.left!=null){
				stack.push(node.left);
			}
		}
		return list;
	}
}

145. 二叉树的后序遍历

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

递归遍历

import java.util.ArrayList;
import java.util.List;

/**
 * @author light
 * @Description 二叉树后序遍历
 * @create 2023-08-13 19:46
 */
public class PostorderTraversalTest {
	public static void main(String[] args) {
		Integer[] data={1, 2, 4, null, null, 5, null, null, 3, null, null };
		BinaryTree tree=new BinaryTree(data);

		System.out.println("递归后序遍历:");
		List<Integer> res1=postorderTraversal_Recursion(tree.root);
		System.out.println(res1);

	}

	//递归遍历
	public static List<Integer> postorderTraversal_Recursion(TreeNode root) {
		List<Integer> res=new ArrayList<>();
		traversal_Recursion(root,res);
		return res;
	}

	public static void traversal_Recursion(TreeNode root,List<Integer> res){
		if(root==null){
			return;
		}
		traversal_Recursion(root.left,res);//左
		traversal_Recursion(root.right,res);//右
		res.add(root.val);//中
	}
	
}

迭代遍历(利用栈)

import java.util.*;

/**
 * @author light
 * @Description 二叉树后序遍历
 * @create 2023-08-13 19:46
 */
public class PostorderTraversalTest {
	public static void main(String[] args) {
		Integer[] data={1, 2, 4, null, null, 5, null, null, 3, null, null };
		BinaryTree tree=new BinaryTree(data);

		System.out.println("迭代后续遍历");
		List<Integer> res2=postorderTraversal_Iterate(tree.root);
		System.out.println(res2);

	}
	//迭代遍历(利用栈:后序遍历顺序:左-右-中,入栈顺序:中-左-右 出栈顺序:中-右-左, 最后翻转结果
	public static List<Integer> postorderTraversal_Iterate(TreeNode root) {
		List<Integer> list=new ArrayList<>();
		Deque<TreeNode> stack=new ArrayDeque<>();
		if(root==null){
			return list;
		}
		stack.push(root);
		while(!stack.isEmpty()){
			TreeNode node=stack.pop();
			list.add(node.val);
			if(node.left!=null){
				stack.push(node.left);
			}
			if(node.right!=null){
				stack.push(node.right);
			}
		}
		Collections.reverse(list);
		return list;
	}
}

94. 二叉树的中序遍历

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。文章来源地址https://www.toymoban.com/news/detail-651198.html

递归遍历

import java.util.ArrayList;
import java.util.List;

/**
 * @author light
 * @Description 二叉树中序遍历
 * @create 2023-08-13 19:48
 */
public class InorderTraversalTest {
	public static void main(String[] args) {
		Integer[] data={1, 2, 4, null, null, 5, null, null, 3, null, null };
		BinaryTree tree=new BinaryTree(data);
		System.out.println("递归中序遍历");
		List<Integer> res=inorderTraversal_Recursion(tree.root);
		System.out.println(res);
	}

	//递归遍历
	public static List<Integer> inorderTraversal_Recursion(TreeNode root) {
		List<Integer> res=new ArrayList<>();
		traversal_Recursion(root,res);
		return res;
	}

	public static void traversal_Recursion(TreeNode root,List<Integer> res){
		if(root==null){
			return;
		}
		traversal_Recursion(root.left,res);//左
		res.add(root.val);//中
		traversal_Recursion(root.right,res); //右

	}
	
}

迭代遍历(利用栈)



import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;

/**
 * @author light
 * @Description 二叉树中序遍历
 * @create 2023-08-13 19:48
 */
public class InorderTraversalTest {
	public static void main(String[] args) {
		Integer[] data={1, 2, 4, null, null, 5, null, null, 3, null, null };
		BinaryTree tree=new BinaryTree(data);
		System.out.println("迭代中序遍历");
		List<Integer> res2=inorderTraversal_Iterate(tree.root);
		System.out.println(res2);
	}

	//迭代遍历
	public static List<Integer> inorderTraversal_Iterate(TreeNode root) {
		List<Integer> list=new ArrayList<>();
		TreeNode cur=root;//用来遍历二叉树
		Deque<TreeNode> stack=new ArrayDeque<>(); //用来存放遍历过的结点
		if(cur==null){
			return list;
		}
		while(cur!=null||!stack.isEmpty()){
			if(cur!=null){
				stack.push(cur);
				cur=cur.left;
			}else {
				cur=stack.pop();
				list.add(cur.val);
				cur=cur.right;
			}
		}
		return list;
	}
}

到了这里,关于LeetCode ACM模式——二叉树篇(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • leetcode做题笔记111. 二叉树的最小深度

    给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。 本题与求二叉树最大深度的题很像,先判断根节点,再递归看左右子树最小值返回最小深度,由于根节点若在的话至少有一个节点所

    2024年02月11日
    浏览(41)
  • leetcode做题笔记124. 二叉树中的最大路径和

    二叉树中的  路径  被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中  至多出现一次  。该路径  至少包含一个  节点,且不一定经过根节点。 路径和  是路径中各节点值的总和。 给你一个二叉树的根节点  root  ,返回其  最

    2024年02月10日
    浏览(47)
  • leetcode做题笔记107. 二叉树的层序遍历 II

    给你二叉树的根节点  root  ,返回其节点值  自底向上的层序遍历  。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 本题要求二叉树的层序遍历,并且是从下至上的层序遍历,可以考虑先按照从上至下的层序遍历先将层序遍历结果放到数组中,再对每层

    2024年02月11日
    浏览(37)
  • leetcode做题笔记106. 从中序与后序遍历序列构造二叉树

    给定两个整数数组  inorder  和  postorder  ,其中  inorder  是二叉树的中序遍历,  postorder  是同一棵树的后序遍历,请你构造并返回这颗  二叉树  。 本题要利用二叉树的中序遍历和后序遍历来确定二叉树,即可不断创建新二叉树将后序遍历的右子树赋值给新二叉树,不断

    2024年02月11日
    浏览(42)
  • Leetcode面试经典150题刷题记录 —— 二叉搜索树篇

    Leetcod面试经典150题刷题记录-系列 Leetcod面试经典150题刷题记录——数组 / 字符串篇 Leetcod面试经典150题刷题记录 —— 双指针篇 Leetcod面试经典150题刷题记录 —— 矩阵篇 Leetcod面试经典150题刷题记录 —— 滑动窗口篇 Leetcod面试经典150题刷题记录 —— 哈希表篇 Leetcod面试经典

    2024年01月23日
    浏览(61)
  • ACM模式数组构建二叉树Go语言实现

    想输入一个数组,然后构造二叉树 例如数组为 [6, 2, 8, 0, 4, 7, 9, -1, -1, 3, 5] 对应的二叉树为: ACM模式数组构建二叉树 重点:如果父节点的数组下标是 i ,那么它的左孩子下标就是 i*2+1 ,右孩子下标就是 i*2+2 。 输出:

    2024年02月10日
    浏览(44)
  • leetcode做题笔记98. 验证二叉搜索树

    给你一个二叉树的根节点  root  ,判断其是否是一个有效的二叉搜索树。 有效  二叉搜索树定义如下: 节点的左子树只包含  小于  当前节点的数。 节点的右子树只包含  大于  当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 本题要判断二叉树是否为二叉

    2024年02月11日
    浏览(37)
  • leetcode做题笔记96. 不同的二叉搜索树

    给你一个整数  n  ,求恰由  n  个节点组成且节点值从  1  到  n  互不相同的  二叉搜索树  有多少种?返回满足题意的二叉搜索树的种数。 本题与上题近似,只需分别考虑左右子树,即f[j-1]*f[i-j]得到状态方程,最后输出f[n[即可,或者直接使用公式,二叉搜索树的种数与

    2024年02月11日
    浏览(36)
  • leetcode做题笔记95. 不同的二叉搜索树 II

    给你一个整数  n  ,请你生成并返回所有由  n  个节点组成且节点值从  1  到  n  互不相同的不同  二叉搜索树   。可以按  任意顺序  返回答案。 本题要列出所有二叉搜索树,即可转换为列举左子树所有集合和右子树所有集合两个问题,分别用递归函数将左右子树根节

    2024年02月11日
    浏览(31)
  • LeetCode刷题(ACM模式)-02链表

    参考引用:代码随想录 注:每道 LeetCode 题目都使用 ACM 代码模式,可直接在本地运行,蓝色字体为题目超链接 0. 链表理论基础 0.1 链表定义 链表是一种 通过指针串联在一起的线性结构 ,每一个节点由两部分组成: 一个是数据域,一个是指针域 (存放指向下一个节点的指针

    2024年02月06日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包