二叉树前序,后序,中序遍历以及验证二叉树

二叉树前序遍历

在这里插入图片描述

public List<Integer> preorderTraversal(TreeNode root) {
	LinkedList<TreeNode> stack = new LinkedList<>();
	LinkedList<Integer> output = new LinkedList<>();
	if (root == null) {return output;}
	stack.add(root);
	while (!stack.isEmpty()) {
		// 从头取
		TreeNode node = stack.pollLast();
		// 从尾输出
		output.add(node.val);
		// 写右到头
		if (node.right != null) {
			stack.add(node.right);
		}
		// 写左到头
		if (node.left != null) {
			stack.add(node.left);
		}
	}
	return output;
}
二叉树后序遍历

在这里插入图片描述

public List<Integer> postorderTraversal(TreeNode root) {
	LinkedList<TreeNode> stack = new LinkedList<>();
	LinkedList<Integer> output = new LinkedList<>();
	if (null == root) {return output;}
	stack.add(root);
	while (!stack.isEmpty()) {
		// 从头取
		TreeNode node = stack.pollLast();
		// 输出头
		output.addFirst(node.val);
		// 左
		if (node.left != null) {
			stack.add(node.left);
		}
		// 右
		if (node.right 1!= null) {
			stack.add(node.right);
		}
	}
	return output;
}
二叉树中序遍历

在这里插入图片描述

public List<Integer> inorderTraversal(TreeNode root) {
	List<Integer> res = new LinkedList<>();
	Stack<TreeNode> stack = new Stack<>();
	TreeNode curr = root;
	// loop未压或者有未弹数据 
	while (!stack.isEmpty() || curr != null) {
		// 压左
		while (curr != null) {
			stack.push(curr);
			curr = curr.left;
		}
		// 弹一个
		curr = stack.pop();
		res.add(curr.val);
		// 转方向
		curr = curr.right;
	}
	return res;
}
验证二叉树的有效性

在这里插入图片描述
在这里插入图片描述

方法一:递归
public boolean isValidBST(TreeNode root) {
	return helper(root, null, null);
}

public boolean helper(TreeNode node, Integer lower, Integer upper) {
	// terminator
	if (node == null) return true;
	// process current logic 
	// 如果当前值越界,则当前方法栈返回false, 且不用继续深搜子树
	int value = node.val;
	if (lower != null && value <= lower) return false;
	if (upper != null && value >= upper) return false;

	// drill down
	if (!helper(node.right, value, upper)) return false;
	if (!helper(node.left, lower, value)) return false;
	
	// restore current status
	// 无
	return true;; // 当前层有效,并且左右子树有效
}
方法一:迭代
public boolean isValidBST(TreeNode root) {
	if (null == root) return true;
	Integer inorder = null;
	Stack<TreeNode> stack = new Stack<>();
	TreeNode curr = root;
	while (!stack.isEmpty() || curr != null) {
	 // 迭代左子树入栈
		while (curr != null) {
			stack.push(curr);
			curr = curr.left;
		}
		curr = stack.pop();
		if (inorder != null && inorder >= curr.val) return false;
		inorder = curr.val;
		// 迭代右子树入栈
		curr = curr.right;
	}
	return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值