二叉树遍历

递归解法

	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--;
		}
	}
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值