html二叉树遍历,二叉树的遍历(前序、中序、后序、层次)

本文详细介绍了二叉树的基本性质,包括每个结点最多有两个子树,非空二叉树的层数与结点数的关系,以及深度为h的二叉树的最大结点数。此外,还深入探讨了二叉树的四种遍历方式:前序遍历、中序遍历、后序遍历和层次遍历,并提供了递归和非递归的实现方法。通过实例展示了各种遍历的顺序。
摘要由CSDN通过智能技术生成

基本性质

每个结点最多有两棵子树,左子树和右子树,顺序不可颠倒。

非空二叉树第\(n\)层最多有\(2^{n-1}\)个元素。

深度为\(h\)的二叉树,至多有\(2^h-1\)个结点。

结点结构

class TreeNode {

int val;

TreeNode left;

TreeNode right;

TreeNode(int x) { val = x; }

}

二叉树的遍历

遍历即将树的所有结点都访问且仅访问一次。按照根结点访问次序的不同,可以分为前序遍历,中序遍历,后序遍历。

前序遍历:根结点 -> 左子树 -> 右子树

中序遍历:左子树 -> 根结点 -> 右子树

后序遍历:左子树 -> 右子树 -> 根结点

另外还有一种层次遍历,即每一层都从左向右遍历。

例如:求下图的二叉树的遍历

ec54378bef0e4c1459ef960d5bb19b64.png

前序遍历:abdefgc

中序遍历:debgfac

后序遍历:edgfbca

层次遍历:abcdfeg

前序遍历

递归实现

List preorderTraversal(TreeNode root) {

List result = new ArrayList();

if (root == null)

return result;

result.add(root.val);

result.addAll(preorderTraversal(root.left));

result.addAll(preorderTraversal(root.right));

return result;

}

非递归实现

List preorderTraversal(TreeNode root) {

List result = new ArrayList();

if (root == null)

return result;

Stack stack = new Stack();

stack.push(root);

while (!stack.isEmpty()) {

TreeNode node = stack.pop();

result.add(node.val);

if (node.right != null)

stack.push(node.right);

if (node.left != null)

stack.push(node.left);

}

return result;

}

另一种实现方法:

List preorderTraversal(TreeNode root) {

List result = new ArrayList();

if (root == null)

return result;

Stack stack = new Stack();

TreeNode p = root;

while (p != null || !stack.isEmpty()) {

if (p != null) {

result.add(p.val);

stack.push(p);

p = p.left;

} else {

p = stack.pop();

p = p.right;

}

}

return result;

}

中序遍历

递归实现

List inorderTraversal(TreeNode root) {

List result = new ArrayList();

if (root == null)

return result;

result.addAll(inorderTraversal(root.left));

result.add(root.val);

result.addAll(inorderTraversal(root.right));

return result;

}

非递归实现

List inorderTraversal(TreeNode root) {

List result = new ArrayList();

if (root == null)

return result;

Stack stack = new Stack();

TreeNode p = root;

while (p != null || !stack.isEmpty()) {

if (p != null) {

stack.push(p);

p = p.left;

} else {

p = stack.pop();

result.add(p.val);

p = p.right;

}

}

return result;

}

后序遍历

递归实现

List postorderTraversal(TreeNode root) {

List result = new ArrayList();

if (root == null)

return result;

result.addAll(postorderTraversal(root.left));

result.addAll(postorderTraversal(root.right));

result.add(root.val);

return result;

}

非递归实现

List postorderTraversal(TreeNode root) {

List result = new ArrayList();

if (root == null)

return result;

Stack stack = new Stack();

TreeNode p = root;

TreeNode last = null;

while (p != null || !stack.isEmpty()) {

if (p != null) {

stack.push(p);

p = p.left;

} else {

TreeNode peek = stack.peek();

if (peek.right != null && last != peek.right) {

p = peek.right;

} else {

peek = stack.pop();

result.add(peek.val);

last = peek;

}

}

}

return result;

}

层次遍历

List levelTraversal(TreeNode root) {

List result = new ArrayList();

if (root == null)

return result;

LinkedList queue = new LinkedList();

queue.addLast(root);

while (queue.size() != 0) {

TreeNode node = queue.pollFirst();

result.add(node.val);

if (node.left != null)

queue.addLast(node.left);

if (node.right != null)

queue.addLast(node.right);

}

return result;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值