您的位置:首页 > 其它

二叉树遍历几种常见方式

2017-08-16 23:00 441 查看
前序遍历
递归版本

非递归版本

中序遍历
递归版本

非递归版本

后序遍历
递归版本

非递归版本

前序遍历

递归版本

先序遍历的递归过程为:若二叉树为空,遍历结束。否则,

访问根结点;

先序遍历根结点的左子树;

先序遍历根结点的右子树。

代码实现如下:

public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new LinkedList<Integer>();
preHelper(root,res);
return res;
}
public void preHelper(TreeNode root, List<Integer> res) {
if (root == null) return;
res.add(root.val);
preHelper(root.left, res);
preHelper(root.right, res);
}


非递归版本

public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
Deque<TreeNode> stack = new ArrayDeque<>();
TreeNode p = root;
while (!stack.isEmpty() || p != null) {
if (p != null) {
stack.push(p);
result.add(p.val);  // 在遍历到左孩子之前添加
p = p.left;
} else {
TreeNode node = stack.pop();
p = node.right;
}
}
return result;
}


中序遍历

递归版本

中序遍历的递归过程为:若二叉树为空,遍历结束。否则,

中序遍历根结点的左子树;

访问根结点;

中序遍历根结点的右子树。

public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if (root == null) return res;
help(root, res);
return res;
}
private void help(TreeNode root, List<Integer> res) {
if (root == null) return;
help(root.left, res);
res.add(root.val);
help(root.right, res);
}


非递归版本

public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
Deque<TreeNode> stack = new ArrayDeque<>();
TreeNode p = root;
while(!stack.isEmpty() || p != null) {
if(p != null) {
stack.push(p);
p = p.left;
} else {
TreeNode node = stack.pop();
result.add(node.val);
p = node.right;
}
}
return result;
}


后序遍历

递归版本

后序遍历的递归过程为:若二叉树为空,遍历结束。否则,

后序遍历根结点的左子树;

后序遍历根结点的右子树。

访问根结点;

public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if (root == null) return res;
help(root, res);
return res;
}
private void help(TreeNode root, List<Integer> res) {
if (root == null) return;
help(root.left, res);
help(root.right, res);
res.add(root.val);
}


非递归版本

public List<Integer> postorderTraversal(TreeNode root) {
LinkedList<Integer> result = new LinkedList<>();
Deque<TreeNode> stack = new ArrayDeque<>();
TreeNode p = root;
while(!stack.isEmpty() || p != null) {
if(p != null) {
stack.push(p);
result.addFirst(p.val);
p = p.right;
} else {
TreeNode node = stack.pop();
p = node.left;
}
}
return result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树