本文目录一览:
- 建立二叉树,并利用递归方法实现先序、中序、后序遍历。
- 用java怎么构造一个二叉树?
- java构建二叉树算法
- 用java怎么构造一个二叉树呢?
- 怎样使用java对二叉树进行层次遍历
- 二叉树的java实现与几种遍历
建立二叉树,并利用递归方法实现先序、中序、后序遍历。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
struct node;
typedef node *tree;
struct node {
char data;
tree lchild, rchild;
};
tree bt;
void build(tree bt) {
char ch;
ch = getchar();
if (ch != '.') {
bt = new node;
bt->data = ch;
build(bt->lchild);
build(bt->rchild);
} else {
bt = NULL;
}
}
void prework() {
ios::sync_with_stdio(false);
build(bt); // 建树
}
void preorder(tree bt) {
if (bt) {
cout << bt->data;
preorder(bt->lchild);
preorder(bt->rchild);
}
}
void midorder(tree bt) {
if (bt) {
preorder(bt->lchild);
cout << bt->data;
preorder(bt->rchild);
}
}
void backorder(tree bt) {
if (bt) {
preorder(bt->lchild);
cout << bt->data;
preorder(bt->rchild);
}
}
void mainwork() {
preorder(bt);
cout << endl;
midorder(bt);
cout << endl;
backorder(bt);
}
int main() {
prework();
mainwork();
return 0;
}
我这里输入的东西是要求叶子节点的子节点为'.',但仍无铃声,则送维修店维修。三无受话现象:
用java怎么构造一个二叉树?
二叉树的相关操作,包括创建,中序、先序、后序(递归和非递归),其中重点的是Java在先序创建二叉树和后序非递归遍历的实现。
package com.algorithm.tree;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Queue;
import java.util.Scanner;
import java.util.Stack;
import java.util.concurrent.LinkedBlockingQueue;
public class Tree {
private Node root;
public Tree() {}
public Tree(Node root) {
this.root = root;
}
// 创建二叉树
public void buildTree() {
Scanner scn = null;
try {
scn = new Scanner(new File("input.txt"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
root = createTree(root, scn);
}
// 先序遍历创建二叉树
private Node createTree(Node node, Scanner scn) {
String temp = scn.next();
if (temp.trim().equals("#")) {
return null;
} else {
node = new Node((T) temp);
node.setLeft(createTree(node.getLeft(), scn));
node.setRight(createTree(node.getRight(), scn));
return node;
}
}
// 中序遍历(递归)
public void inOrderTraverse() {
inOrderTraverse(root);
}
public void inOrderTraverse(Node node) {
if (node != null) {
inOrderTraverse(node.getLeft());
System.out.println(node.getValue());
inOrderTraverse(node.getRight());
}
}
// 中序遍历(非递归)
public void nrInOrderTraverse() {
Stack<Node> stack = new Stack<>();
Node node = root;
while (node != null || !stack.isEmpty()) {
while (node != null) {
stack.push(node);
node = node.getLeft();
}
node = stack.pop();
System.out.println(node.getValue());
node = node.getRight();
}
}
// 先序遍历(递归)
public void preOrderTraverse() {
preOrderTraverse(root);
}
public void preOrderTraverse(Node node) {
if (node != null) {
System.out.println(node.getValue());
preOrderTraverse(node.getLeft());
preOrderTraverse(node.getRight());
}
}
// 先序遍历(非递归)
public void nrPreOrderTraverse() {
Stack<Node> stack = new Stack<>();
Node node = root;
while (node != null || !stack.isEmpty()) {
while (node != null) {
System.out.println(node.getValue());
stack.push(node);
node = node.getLeft();
}
node = stack.pop();
node = node.getRight();
}
}
// 后序遍历(递归)
public void postOrderTraverse() {
postOrderTraverse(root);
}
public void postOrderTraverse(Node node) {
if (node != null) {
postOrderTraverse(node.getLeft());
postOrderTraverse(node.getRight());
System.out.println(node.getValue());
}
}
// 后序遍历(非递归)
public void nrPostOrderTraverse() {
Stack<Node> stack = new Stack<>();
Node node = root;
Node preNode = null;
while (node != null || !stack.isEmpty()) {
while (node != null) {
stack.push(node);
node = node.getLeft();
}
node = stack.peek();
if (node.getRight() == null || node.getRight() == preNode) {
System.out.println(node.getValue());
node = stack.pop();
preNode = node;
node = null;
} else {
node = node.getRight();
}
}
}
// 按层次遍历
public void levelTraverse() {
levelTraverse(root);
}
public void levelTraverse(Node node) {
Queue<Node> queue = new LinkedBlockingQueue<>();
queue.add(node);
while (!queue.isEmpty()) {
Node temp = queue.poll();
if (temp != null) {
System.out.println(temp.getValue());
queue.add(temp.getLeft());
queue.add(temp.getRight());
}
}
}
}
// 树的节点
class Node<T> {
private Node left;
private Node right;
private T value;
public Node() {}
public Node(Node left, Node right, T value) {
this.left = left;
this.right = right;
this.value = value;
}
public Node(T value) {
this(null, null, value);
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this.right = right;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
测试代码:
package com.algorithm.tree;
public class TreeTest {
public static void main(String[] args) {
Tree tree = new Tree();
tree.buildTree();
System.out.println("中序遍历");
tree.inOrderTraverse();
tree.nrInOrderTraverse();
System.out.println("后续遍历");
tree.postOrderTraverse();
tree.nrPostOrderTraverse();
System.out.println("先序遍历");
tree.preOrderTraverse();
tree.nrPreOrderTraverse();
}
}
java构建二叉树算法
public class BinTree {
public final static int MAX = 40;
private Object data;
private BinTree left, right;
BinTree[] elements = new BinTree[MAX];
int front;
int rear;
public BinTree() {}
public BinTree(Object data) {
this.data = data;
left = right = null;
}
public BinTree(Object data, BinTree left, BinTree right) {
this.data = data;
this.left = left;
this.right = right;
}
public String toString() {
return data.toString();
}
// 前序遍历二叉树
public static void preOrder(BinTree parent) {
if (parent == null) return;
System.out.print(parent.data + " ");
preOrder(parent.left);
preOrder(parent.right);
}
// 中序遍历二叉树
public void inOrder(BinTree parent) {
if (parent == null) return;
inOrder(parent.left);
System.out.print(parent.data + " ");
inOrder(parent.right);
}
// 后序遍历二叉树
public void postOrder(BinTree parent) {
if (parent == null) return;
postOrder(parent.left);
postOrder(parent.right);
System.out.print(parent.data + " ");
}
// 层次遍历二叉树
public void LayerOrder(BinTree parent) {
elements[0] = parent;
front = 0;
rear = 1;
while (front < rear) {
try {
if (elements[front].data != null) {
System.out.print(elements[front].data + " ");
if (elements[front].left != null)
elements[rear++] = elements[front].left;
if (elements[front].right != null)
elements[rear++] = elements[front].right;
front++;
}
} catch (Exception e) {
break;
}
}
}
// 返回树的叶节点个数
public int leaves() {
if (this == null) return 0;
if (left == null && right == null) return 1;
return (left == null ? 0 : left.leaves()) + (right == null ? 0 : right.leaves());
}
// 结果返回树的高度
public int height() {
int heightOfTree;
if (this == null) return -1;
int leftHeight = (left == null ? 0 : left.height());
int rightHeight = (right == null ? 0 : right.height());
heightOfTree = leftHeight > rightHeight ? leftHeight : rightHeight;
return 1 + heightOfTree;
}
// 如果对象不在树中,结果返回-1;否则结果返回该对象在树中所处的层次,规定根节点为第一层
public int level(Object object) {
int levelInTree;
if (this == null) return -1;
if (object == data) return 1;
int leftLevel = (left == null ? -1 : left.level(object));
int rightLevel = (right == null ? -1 : right.level(object));
if (leftLevel < 0 && rightLevel < 0) return -1;
levelInTree = leftLevel > rightLevel ? rightLevel : leftLevel;
return 1 + levelInTree;
}
// 将树中的每个节点的孩子对换位置
public void reflect() {
if (this == null) return;
if (left != null) left.reflect();
if (right != null) right.reflect();
BinTree temp = left;
left = right;
right = temp;
}
// 将树中的所有节点移走,并输出移走的节点
public void defoliate() {
if (this == null) return;
if (left == null && right == null) {
System.out.print(this + " ");
data = null;
return;
}
if (left != null) {
left.defoliate();
left = null;
}
System.out.print(this + " ");
data = null;
if (right != null) {
right.defoliate();
right = null;
}
}
public static void main(String[] args) {
BinTree e = new BinTree("E");
BinTree g = new BinTree("G");
BinTree h = new BinTree("H");
BinTree i = new BinTree("I");
BinTree d = new BinTree("D", null, g);
BinTree f = new BinTree("F", h, i);
BinTree b = new BinTree("B", d, e);
BinTree c = new BinTree("C", f, null);
BinTree tree = new BinTree("A", b, c);
System.out.println("前序遍历二叉树结果: ");
tree.preOrder(tree);
System.out.println();
System.out.println("中序遍历二叉树结果: ");
tree.inOrder(tree);
System.out.println();
System.out.println("后序遍历二叉树结果: ");
tree.postOrder(tree);
System.out.println();
System.out.println("层次遍历二叉树结果: ");
tree.LayerOrder(tree);
System.out.println();
System.out.println("F所在的层次: " + tree.level("F"));
System.out.println("这棵二叉树的高度: " + tree.height());
System.out.println("--------------------------------------");
tree.reflect();
System.out.println("交换每个节点的孩子节点后......");
System.out.println("前序遍历二叉树结果: ");
tree.preOrder(tree);
System.out.println();
System.out.println("中序遍历二叉树结果: ");
tree.inOrder(tree);
System.out.println();
System.out.println("后序遍历二叉树结果: ");
tree.postOrder(tree);
System.out.println();
System.out.println("层次遍历二叉树结果: ");
tree.LayerOrder(tree);
System.out.println();
System.out.println("F所在的层次: " + tree.level("F"));
System.out.println("这棵二叉树的高度: " + tree.height());
}
}
用java怎么构造一个二叉树呢?
Java构造二叉树,可以通过链表来构造,如下代码:
public class BinTree {
public final static int MAX = 40;
BinTree[] elements = new BinTree[MAX];
int front;
int rear;
private Object data;
private BinTree left, right;
public BinTree() {}
public BinTree(Object data) {
this.data = data;
left = right = null;
}
public BinTree(Object data, BinTree left, BinTree right) {
this.data = data;
this.left = left;
this.right = right;
}
public String toString() {
return data.toString();
}
// 前序遍历二叉树
public static void preOrder(BinTree parent) {
if (parent == null) return;
System.out.print(parent.data + " ");
preOrder(parent.left);
preOrder(parent.right);
}
// 中序遍历二叉树
public void inOrder(BinTree parent) {
if (parent == null) return;
inOrder(parent.left);
System.out.print(parent.data + " ");
inOrder(parent.right);
}
// 后序遍历二叉树
public void postOrder(BinTree parent) {
if (parent == null) return;
postOrder(parent.left);
postOrder(parent.right);
System.out.print(parent.data + " ");
}
// 层次遍历二叉树
public void LayerOrder(BinTree parent) {
elements[0] = parent;
front = 0;
rear = 1;
while (front < rear) {
try {
if (elements[front].data != null) {
System.out.print(elements[front].data + " ");
if (elements[front].left != null)
elements[rear++] = elements[front].left;
if (elements[front].right != null)
elements[rear++] = elements[front].right;
front++;
}
} catch (Exception e) {
break;
}
}
}
// 返回树的叶节点个数
public int leaves() {
if (this == null) return 0;
if (left == null && right == null) return 1;
return (left == null ? 0 : left.leaves()) + (right == null ? 0 : right.leaves());
}
// 结果返回树的高度
public int height() {
int heightOfTree;
if (this == null) return -1;
int leftHeight = (left == null ? 0 : left.height());
int rightHeight = (right == null ? 0 : right.height());
heightOfTree = leftHeight > rightHeight ? leftHeight : rightHeight;
return 1 + heightOfTree;
}
// 如果对象不在树中,结果返回-1;否则结果返回该对象在树中所处的层次,规定根节点为第一层
public int level(Object object) {
int levelInTree;
if (this == null) return -1;
if (object == data) return 1;
int leftLevel = (left == null ? -1 : left.level(object));
int rightLevel = (right == null ? -1 : right.level(object));
if (leftLevel < 0 && rightLevel < 0) return -1;
levelInTree = leftLevel > rightLevel ? rightLevel : leftLevel;
return 1 + levelInTree;
}
// 将树中的每个节点的孩子对换位置
public void reflect() {
if (this == null) return;
if (left != null) left.reflect();
if (right != null) right.reflect();
BinTree temp = left;
left = right;
right = temp;
}
// 将树中的所有节点移走,并输出移走的节点
public void defoliate() {
if (this == null) return;
if (left == null && right == null) {
System.out.print(this + " ");
data = null;
return;
}
if (left != null) {
left.defoliate();
left = null;
}
System.out.print(this + " ");
data = null;
if (right != null) {
right.defoliate();
right = null;
}
}
public static void main(String[] args) {
BinTree e = new BinTree("E");
BinTree g = new BinTree("G");
BinTree h = new BinTree("H");
BinTree i = new BinTree("I");
BinTree d = new BinTree("D", null, g);
BinTree f = new BinTree("F", h, i);
BinTree b = new BinTree("B", d, e);
BinTree c = new BinTree("C", f, null);
BinTree tree = new BinTree("A", b, c);
System.out.println("前序遍历二叉树结果: ");
tree.preOrder(tree);
System.out.println();
System.out.println("中序遍历二叉树结果: ");
tree.inOrder(tree);
System.out.println();
System.out.println("后序遍历二叉树结果: ");
tree.postOrder(tree);
System.out.println();
System.out.println("层次遍历二叉树结果: ");
tree.LayerOrder(tree);
System.out.println();
System.out.println("F所在的层次: " + tree.level("F"));
System.out.println("这棵二叉树的高度: " + tree.height());
System.out.println("--------------------------------------");
tree.reflect();
System.out.println("交换每个节点的孩子节点后......");
System.out.println("前序遍历二叉树结果: ");
tree.preOrder(tree);
System.out.println();
System.out.println("中序遍历二叉树结果: ");
tree.inOrder(tree);
System.out.println();
System.out.println("后序遍历二叉树结果: ");
tree.postOrder(tree);
System.out.println();
System.out.println("层次遍历二叉树结果: ");
tree.LayerOrder(tree);
System.out.println();
System.out.println("F所在的层次: " + tree.level("F"));
System.out.println("这棵二叉树的高度: " + tree.height());
}
}
怎样使用java对二叉树进行层次遍历
public class BinaryTree {
int data;
BinaryTree left;
BinaryTree right;
public BinaryTree(int data) {
this.data = data;
left = null;
right = null;
}
public void insert(BinaryTree root, int data) {
if (data > root.data) {
if (root.right == null) {
root.right = new BinaryTree(data);
} else {
this.insert(root.right, data);
}
} else {
if (root.left == null) {
root.left = new BinaryTree(data);
} else {
this.insert(root.left, data);
}
}
}
}
当建立好二叉树类后可以创建二叉树实例,并实现二叉树的先根遍历,中根遍历,后根遍历,代码如下:
public class BinaryTreePreorder {
public static void preOrder(BinaryTree root) {
if (root != null) {
System.out.print(root.data + "-");
preOrder(root.left);
preOrder(root.right);
}
}
public static void inOrder(BinaryTree root) {
if (root != null) {
inOrder(root.left);
System.out.print(root.data + "--");
inOrder(root.right);
}
}
public static void postOrder(BinaryTree root) {
if (root != null) {
postOrder(root.left);
postOrder(root.right);
System.out.print(root.data + "---");
}
}
public static void main(String[] str) {
int[] array = {12, 76, 35, 22, 16, 48, 90, 46, 9, 40};
BinaryTree root = new BinaryTree(array[0]);
for (int i = 1; i < array.length; i++) {
root.insert(root, array[i]);
}
System.out.println("先根遍历:");
preOrder(root);
System.out.println();
System.out.println("中根遍历:");
inOrder(root);
System.out.println();
System.out.println("后根遍历:");
postOrder(root);
}
}
二叉树的java实现与几种遍历
二叉树的定义
二叉树(Binary Tree)是结点的有限集合,这个集合或者为空,或者由一个根及两个互不相交的称为这个根的左子树或右子树构成。 从定义可以看出,二叉树包括:
- 空树
- 只有一个根节点
- 只有左子树
- 只有右子树
- 左右子树都存在 有且仅有这5种表现形式。
二叉树的遍历分为三种:
- 前序遍历:按照“根左右”,先遍历根节点,再遍历左子树,最后遍历右子树。
- 中序遍历:按照“左根右”,先遍历左子树,再遍历根节点,最后遍历右子树。
- 后序遍历:按照“左右根”,先遍历左子树,再遍历右子树,最后遍历根节点。 其中前、后、中指的是每次遍历时候的根节点被遍历的顺序。 具体实现看下图: