本文目錄一覽:
- 1、建立二叉樹,並利用遞歸方法實現先序、中序、後序遍歷。
- 2、用java怎麼構造一個二叉樹?
- 3、java構建二叉樹演算法
- 4、用java怎麼構造一個二叉樹呢?
- 5、怎樣使用java對二叉樹進行層次遍歷
- 6、二叉樹的java實現與幾種遍歷
建立二叉樹,並利用遞歸方法實現先序、中序、後序遍歷。
#include
#include
#include
#include
#include
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);
//freopen(“data.in”,”r”,stdin);
build(bt); //建樹
}
void preorder(tree bt){
if(bt){
coutdata;
preorder(bt-lchild);
preorder(bt-rchild);
}
}
void midorder(tree bt){
if(bt){
preorder(bt-lchild);
coutdata;
preorder(bt-rchild);
}
}
void backorder(tree bt){
if(bt){
preorder(bt-lchild);
coutdata;
preorder(bt-rchild);
}
}
void mainwork(){
preorder(bt);
coutendl;
midorder(bt);
coutendl;
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) {
// TODO Auto-generated catch block
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() {
StackNode stack = new StackNode();
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() {
StackNode stack = new StackNode();
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() {
StackNode stack = new StackNode();
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) {
QueueNode queue = new LinkedBlockingQueueNode();
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 {
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 {
/**
* @param args
*/
public static void main(String[] args) {
Tree tree = new Tree();
tree.buildTree();
System.out.println(“中序遍歷”);
tree.inOrderTraverse();
tree.nrInOrderTraverse();
System.out.println(“後續遍歷”);
//tree.nrPostOrderTraverse();
tree.postOrderTraverse();
tree.nrPostOrderTraverse();
System.out.println(“先序遍歷”);
tree.preOrderTraverse();
tree.nrPreOrderTraverse();
//
}
}
java構建二叉樹演算法
//******************************************************************************************************//
//*****本程序包括簡單的二叉樹類的實現和前序,中序,後序,層次遍歷二叉樹演算法,*******//
//******以及確定二叉樹的高度,制定對象在樹中的所處層次以及將樹中的左右***********//
//******孩子節點對換位置,返回葉子節點個數刪除葉子節點,並輸出所刪除的葉子節點**//
//*******************************CopyRight By phoenix*******************************************//
//************************************Jan 12,2008*************************************************//
//****************************************************************************************************//
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(frontrear)
{
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 == nullright == 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 = leftHeightrightHeight?rightHeight:leftHeight;
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(leftLevel0rightLevel0)
return -1;
levelInTree = leftLevelrightLevel?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()
{
String innerNode = “”;
if(this == null)
return;
//若本節點是葉節點,則將其移走
if(left==nullright == null)
{
System.out.print(this + ” “);
data = null;
return;
}
//移走左子樹若其存在
if(left!=null){
left.defoliate();
left = null;
}
//移走本節點,放在中間表示中跟移走…
innerNode += this + ” “;
data = null;
//移走右子樹若其存在
if(right!=null){
right.defoliate();
right = null;
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
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(frontrear)
{
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 == nullright == 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 = leftHeightrightHeight?rightHeight:leftHeight;
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(leftLevel0rightLevel0)
return -1;
levelInTree = leftLevelrightLevel?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==nullright == null)
{
System.out.print(this + ” “);
data = null;
return;
}
//移走左子樹若其存在
if(left!=null){
left.defoliate();
left = null;
}
//移走本節點,放在中間表示中跟移走…
String innerNode += this + ” “;
data = null;
//移走右子樹若其存在
if(right!=null){
right.defoliate();
right = null;
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
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(dataroot.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);
}
}
}
}
當建立好二叉樹類後可以創建二叉樹實例,並實現二叉樹的先根遍歷,中根遍歷,後根遍歷,代碼如下:
package package2;
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;iarray.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)是結點的有限集合,這個集合或者空,或者由一個根及兩個互不相交的稱為這個根的左子樹或右子樹構成.
從定義可以看出,二叉樹包括:1.空樹 2.只有一個根節點 3.只有左子樹 4.只有右子樹 5.左右子樹都存在 有且僅有這5種表現形式
二叉樹的遍歷分為三種:前序遍歷 中序遍歷 後序遍歷
前序遍歷:按照「根左右」,先遍歷根節點,再遍歷左子樹 ,再遍歷右子樹
中序遍歷:按照「左根右「,先遍歷左子樹,再遍歷根節點,最後遍歷右子樹
後續遍歷:按照「左右根」,先遍歷左子樹,再遍歷右子樹,最後遍歷根節點
其中前,後,中指的是每次遍歷時候的根節點被遍歷的順序
具體實現看下圖:
原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/128905.html