二叉树遍历

递归解法

	List<Integer> path = null;

	public List<Integer> preorderTraversal(TreeNode root) {
		path = new ArrayList<Integer>();
		dfs3(root);
		return path;
	}

	/**
	 * 前序
	 * @param root
	 */
	public void dfs(TreeNode root) {
		if (root == null) {
			return;
		}
		path.add(root.val);
		dfs(root.left);
		dfs(root.right);
	}
	
	/**
	 * 中序
	 * @param root
	 */
	public void dfs2(TreeNode root) {
		if (root == null) {
			return;
		}
		dfs2(root.left);
		path.add(root.val);
		dfs2(root.right);
	}
	
	/**
	 * 后序
	 * @param root
	 */
	public void dfs3(TreeNode root) {
		if (root == null) {
			return;
		}
		dfs3(root.left);
		dfs3(root.right);
		path.add(root.val);
	}

迭代解法

	/**
	 * 迭代前序遍历
	 * @param root
	 * @return
	 */
	public List<Integer> preOrderIteration(TreeNode root) {
		path = new ArrayList<Integer>();
		if (root == null) {
			return path;
		}
		Deque<TreeNode> stack = new LinkedList<TreeNode>();
		while (!stack.isEmpty() || root != null) {
			while (root != null) {
				path.add(root.val);
				stack.push(root);
				root = root.left;
			}
			root = stack.pop();
			root = root.right;
		}
		return path;
	}
	
	
	/**
	 * 迭代前序遍历
	 * @param root
	 * @return
	 */
	public List<Integer> preOrderIteration2(TreeNode root) {
		path = new ArrayList<Integer>();
		if (root == null) {
			return path;
		}
		Deque<TreeNode> stack = new LinkedList<TreeNode>();
		stack.push(root);
		while (!stack.isEmpty()) {
			TreeNode head = stack.pop();
			path.add(head.val);
			if (head.right != null) {
				stack.push(head.right);
			}
			if (head.left != null) {
				stack.push(head.left);
			}
		}
		return path;
	}
	
	
	/**
	 * 迭代中序遍历
	 * @param head
	 */
	public List<Integer> inOrderIteration(TreeNode root) {
		List<Integer> path = new ArrayList<Integer>();
		if (root == null) {
			return path;
		}
		Deque<TreeNode> stack = new LinkedList<TreeNode>();
		TreeNode cur = root;
		while (!stack.isEmpty() || cur != null) {
			while (cur != null) {
				stack.push(cur);
				cur = cur.left;
			}
			TreeNode head = stack.pop();
			path.add(head.val);
			if (head.right != null) {
				cur = head.right;
			}
		}
		return path;
	}
	
	/**
	 * 迭代后续遍历
	 * @param args
	 */
	public List<Integer> postOrderIteration(TreeNode root) {
		List<Integer> path = new ArrayList<Integer>();
		if (root == null) {
			return path;
		}
		Deque<TreeNode> stack1 = new LinkedList<TreeNode>();
		Deque<TreeNode> stack2 = new LinkedList<TreeNode>();
		stack1.push(root);
		while (!stack1.isEmpty()) {
			TreeNode head = stack1.pop();
			stack2.push(head);
			if (head.left != null) {
				stack1.push(head.left);
			}
			if (head.right != null) {
				stack1.push(head.right);
			}
		}
		while (!stack2.isEmpty()) {
			path.add(stack2.pop().val);
		}
		return path;
	}
	
	/**
	 * 迭代后续遍历
	 * @param args
	 */
	public List<Integer> postOrderIteration2(TreeNode root) {
		List<Integer> path = new ArrayList<Integer>();
		if (root == null) {
			return path;
		}
		TreeNode cur = root;
		Deque<TreeNode> stack = new LinkedList<TreeNode>();
		stack.push(root);
		while (!stack.isEmpty()) {
			TreeNode peek = stack.peek();
			if (peek.left != null && peek.left != cur && peek.right != cur) {
				stack.push(peek.left);
			} else if (peek.right != null && peek.right != cur) {
				stack.push(peek.right);
			} else {
				path.add(stack.pop().val);
				cur = peek;
			}
		}
		return path;
	}

Morris解法

在这里插入图片描述

/**
	 * Morris前序遍历
	 * @param root
	 * @return
	 */
	public List<Integer> preOrderMorris(TreeNode root) {
		List<Integer> path = new ArrayList<Integer>();
		if (root == null) {
			return path;
		}
		TreeNode cur1 = root;
		TreeNode cur2 = null;
		while (cur1 != null) {
			cur2 = cur1.left;
			if (cur2 != null) {
				while (cur2.right != null && cur2.right != cur1) {
					cur2 = cur2.right;
				}
				if (cur2.right == null) {
					cur2.right = cur1;
					path.add(cur1.val);
					cur1 = cur1.left;
					continue;
				} else {
					cur2.right = null;
				}
			} else {
				path.add(cur1.val);
			}
			cur1 = cur1.right;
		}
		return path;
	}
	
	/**
	 * Morris中序遍历
	 * @param root
	 * @return
	 */
	public List<Integer> inOrderMorris(TreeNode root) {
		List<Integer> path = new ArrayList<Integer>();
		if (root == null) {
			return path;
		}
		TreeNode cur1 = root;
		TreeNode cur2 = null;
		while (cur1 != null) {
			cur2 = cur1.left;
			if (cur2 != null) {
				while (cur2.right != null && cur2.right != cur1) {
					cur2 = cur2.right;
				}
				if (cur2.right == null) {
					cur2.right = cur1;
					cur1 = cur1.left;
					continue;
				} else {
					cur2.right = null;
				}
			} 
			path.add(cur1.val);
			cur1 = cur1.right;
		}
		return path;
	}
    /**
	 * Morris后续遍历
	 * @param root
	 * @return
	 */
	public List<Integer> postOrderMorris(TreeNode root) {
		List<Integer> path = new ArrayList<Integer>();
		if (root == null) {
			return path;
		}
		TreeNode cur1 = root;
		TreeNode cur2 = null;
		while (cur1 != null) {
			cur2 = cur1.left;
			if (cur2 != null) {
				while (cur2.right != null && cur2.right != cur1) {
					cur2 = cur2.right;
				}
				if (cur2.right == null) {
					cur2.right = cur1;
					cur1 = cur1.left;
					continue;
				} else {
					cur2.right = null;
					addPath(path, cur1.left);
				}
			}
			cur1 = cur1.right;
		}
		addPath(path, root);
		return path;
	}
	
	public void addPath(List<Integer> res, TreeNode node) {
		int count = 0;
		while (node != null) {
			++count;
			res.add(node.val);
			node = node.right;
		}
		int left = res.size() - count, right = res.size() - 1;
		while (left < right) {
			int temp = res.get(left);
			res.set(left, res.get(right));
			res.set(right, temp);
			left++;
			right--;
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值