java实现遍历_二叉树的三种遍历(java实现)

import java.io.*;import java.util.*;public classMain {public static void main(String[] args) throwsIOException {

BufferedReader br= new BufferedReader(newInputStreamReader(System.in));

br.readLine();

TreeNode root=createTreeNode(br);

preOrderMorris(root);

inOrderMorris(root);

postOrderMorris(root);

br.close();

}/*** Morris 遍历算法整体步骤如下(假设当前遍历到的节点为 xx):

* 如果 xx 无左孩子,则访问 xx 的右孩子,即 x = x.right。

* 如果 xx 有左孩子,则找到 xx 左子树上最右的节点(即左子树中序遍历的最后一个节点,xx 在中序遍历中的前驱节点),我们记为predecessor。根据predecessor 的右孩子是否为空,进行如下操作。

* 如果 predecessor 的右孩子为空,则将其右孩子指向 xx,然后访问 xx 的左孩子,即 x = x.left。

* 如果 predecessor 的右孩子不为空,则此时其右孩子指向 xx,说明我们已经遍历完 xx 的左子树,我们将predecessor 的右孩子置空,

然后访问 xx 的右孩子,即 x = x.right。

* 作者:LeetCode-Solution

* 链接:https://leetcode-cn.com/problems/recover-binary-search-tree/solution/hui-fu-er-cha-sou-suo-shu-by-leetcode-solution/* 来源:力扣(LeetCode)

* 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

**/

//先序遍历 Morris遍历 莫里斯遍历

private static voidpreOrderMorris(TreeNode root) {if (null ==root) {return;

}

TreeNode cur= root, predecessor = null;while (null !=cur) {

predecessor=cur.left;if (null !=predecessor) {while (null != predecessor.right && cur !=predecessor.right) {

predecessor=predecessor.right;

}if (null ==predecessor.right) {

predecessor.right=cur;

System.out.print(cur.val+ " ");

cur=cur.left;continue;

}else{

predecessor.right= null;

}

}else{

System.out.print(cur.val+ " ");

}

cur=cur.right;

}

System.out.println();

}//中序遍历 morris遍历, 复用空指针指向上层某个节点//这里为左子树最右结点指向根结点

private static voidinOrderMorris(TreeNode root) {if (null ==root) {return;

}

TreeNode cur= root, predecessor = null;while (null !=cur) {

predecessor=cur.left;if (null !=predecessor) {//获取左子树上的最右结点

while (null != predecessor.right && cur !=predecessor.right) {

predecessor=predecessor.right;

}if (null ==predecessor.right) {//左子树上的最右结点 指向当前结点

predecessor.right =cur;

cur=cur.left;continue; //注意这里的continue;

} else{//复原空指针

predecessor.right = null;

}

}

System.out.print(cur.val+ " ");

cur=cur.right;

}

System.out.println();return;

}//后序遍历 morris遍历

private static voidpostOrderMorris(TreeNode root) {if (null ==root) {return;

}

TreeNode cur= root, prodecessor = null;while (null !=cur) {

prodecessor=cur.left;if (null !=prodecessor) {while (null != prodecessor.right && cur !=prodecessor.right) {

prodecessor=prodecessor.right;

}if (null ==prodecessor.right) {

prodecessor.right=cur;

cur=cur.left;continue; //这里的continue;

} else{

prodecessor.right= null;

printEdge(cur.left);

}

}

cur=cur.right;

}

printEdge(root);

System.out.println();

}private static voidprintEdge(TreeNode root) {//逆序右边界

TreeNode tail =reverseEdge(root);

TreeNode cur=tail;while (null !=cur) {

System.out.print(cur.val+ " ");

cur=cur.right;

}

reverseEdge(tail);

}private staticTreeNode reverseEdge(TreeNode from) {

TreeNode next= null, pre = null;while (null !=from) {

next=from.right;

from.right=pre;

pre=from;

from=next;

}returnpre;

}private static TreeNode createTreeNode(BufferedReader br) throwsIOException {

String[] rawInput= br.readLine().trim().split(" ");int rootVal = Integer.parseInt(rawInput[0]);int leftVal = Integer.parseInt(rawInput[1]);int rightVal = Integer.parseInt(rawInput[2]);

TreeNode root= newTreeNode(rootVal);if (0 !=leftVal) {

root.left=createTreeNode(br);

}if (0 !=rightVal) {

root.right=createTreeNode(br);

}returnroot;

}

}classTreeNode {intval;

TreeNode left;

TreeNode right;public TreeNode(intval) {this.val =val;

}public TreeNode(intval, TreeNode left, TreeNode right) {this.val =val;this.left =left;this.right =right;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 遍历二叉树三种方法是前序遍历、中序遍历和后序遍历,下面是它们的实现方式: 1. 前序遍历 前序遍历的顺序是先访问根节点,再遍历左子树,最后遍历右子树。实现方式如下: ```java public void preOrderTraversal(Node node) { if (node != null) { System.out.print(node.val + " "); preOrderTraversal(node.left); preOrderTraversal(node.right); } } ``` 2. 中序遍历 中序遍历的顺序是先遍历左子树,再访问根节点,最后遍历右子树。实现方式如下: ```java public void inOrderTraversal(Node node) { if (node != null) { inOrderTraversal(node.left); System.out.print(node.val + " "); inOrderTraversal(node.right); } } ``` 3. 后序遍历 后序遍历的顺序是先遍历左子树,再遍历右子树,最后访问根节点。实现方式如下: ```java public void postOrderTraversal(Node node) { if (node != null) { postOrderTraversal(node.left); postOrderTraversal(node.right); System.out.print(node.val + " "); } } ``` 以上三种遍历方式都可以采用递归实现,也可以采用迭代实现。递归实现比较简单,下面给出迭代实现的代码: 1. 前序遍历迭代实现 ```java public void preOrderTraversal(Node root) { if (root == null) { return; } Stack<Node> stack = new Stack<>(); stack.push(root); while (!stack.isEmpty()) { Node node = stack.pop(); System.out.print(node.val + " "); if (node.right != null) { stack.push(node.right); } if (node.left != null) { stack.push(node.left); } } } ``` 2. 中序遍历迭代实现 ```java public void inOrderTraversal(Node root) { if (root == null) { return; } Stack<Node> stack = new Stack<>(); Node node = root; while (node != null || !stack.isEmpty()) { while (node != null) { stack.push(node); node = node.left; } node = stack.pop(); System.out.print(node.val + " "); node = node.right; } } ``` 3. 后序遍历迭代实现 ```java public void postOrderTraversal(Node root) { if (root == null) { return; } Stack<Node> stack = new Stack<>(); stack.push(root); Stack<Node> result = new Stack<>(); while (!stack.isEmpty()) { Node node = stack.pop(); result.push(node); if (node.left != null) { stack.push(node.left); } if (node.right != null) { stack.push(node.right); } } while (!result.isEmpty()) { System.out.print(result.pop().val + " "); } } ``` 以上是 Java 遍历二叉树三种方法的实现,其中迭代实现比递归实现稍微复杂一些,但也更加灵活。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值