二叉树java实现

package com.gzsll.ds;

import java.util.Stack;

public class BinaryTree {
	private static class BinaryTreeNode {
		BinaryTreeNode lChild, rChild;
		Object data;

		public BinaryTreeNode(Object data, BinaryTreeNode lChild,
				BinaryTreeNode rChild) {
			this.data = data;
			this.rChild = rChild;
			this.lChild = lChild;
		}

		public BinaryTreeNode(Object data) {
			this(data, null, null);
		}

		public BinaryTreeNode() {
		}

		public BinaryTreeNode getlChild() {
			return lChild;
		}

		public void setlChild(BinaryTreeNode lChild) {
			this.lChild = lChild;
		}

		public BinaryTreeNode getrChild() {
			return rChild;
		}

		public void setrChild(BinaryTreeNode rChild) {
			this.rChild = rChild;
		}

		public Object getData() {
			return data;
		}

		public void setData(Object data) {
			this.data = data;
		}

	}

	public static BinaryTreeNode createTree(String exp) {
		BinaryTreeNode[] nodes = new BinaryTreeNode[3];
		BinaryTreeNode b, p = null;
		int top = -1, k = 0, j = 0;
		char[] exps = exp.toCharArray();
		char data = exps[j];
		b = null;
		while (j < exps.length - 1) {
			switch (data) {
			case '(':
				top++;
				nodes[top] = p;
				k = 1;
				break;
			case ')':
				top--;
				break;
			case ',':
				k = 2;
				break;
			default:
				p = new BinaryTreeNode(data, null, null);
				if (b == null) {
					b = p;
				} else {
					switch (k) {
					case 1:
						nodes[top].setlChild(p);
						break;
					case 2:
						nodes[top].setrChild(p);
						break;
					}
				}
			}
			j++;
			data = exps[j];
		}
		return b;
	}

	/**
	 * 递归实现先序遍历
	 * 
	 * @param node
	 */
	public void PreOrder(BinaryTreeNode node) {
		if (node == null) {
			return;
		} else {
			System.out.print(node.getData() + " ");
			PreOrder(node.getlChild());
			PreOrder(node.getrChild());

		}
	}

	/**
	 * 递归实现中序遍历
	 * 
	 * @param node
	 */
	public void InOrder(BinaryTreeNode node) {
		if (node == null) {
			return;
		} else {
			InOrder(node.getlChild());
			System.out.print(node.getData() + " ");
			InOrder(node.getrChild());
		}
	}

	/**
	 * 递归实现后序遍历
	 * 
	 * @param node
	 */
	public void PostOrder(BinaryTreeNode node) {
		if (node == null) {
			return;
		} else {
			PostOrder(node.getlChild());
			PostOrder(node.getrChild());
			System.out.print(node.getData() + " ");
		}
	}

	/**
	 * 非递归前序遍历 对于任一结点P:
	 * 
	 * 1)访问结点P,并将结点P入栈;
	 * 
	 * 2)判断结点P的左孩子是否为空,若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P,循环至1);若不为空,
	 * 则将P的左孩子置为当前的结点P;
	 * 
	 * 3)直到P为NULL并且栈为空,则遍历结束。
	 */
	public void PreOrder2(BinaryTreeNode node) {
		Stack<BinaryTreeNode> s = new Stack<BinaryTree.BinaryTreeNode>();
		while (node != null || !s.isEmpty()) {
			while (node != null) {
				System.out.print(node.getData() + " ");
				s.push(node);
				node = node.getlChild();
			}
			while (!s.isEmpty()) {
				node = s.pop();
				node = node.getrChild();
			}
		}
	}

	/**
	 * 非递归实现中序遍历
	 * 1)若其左孩子不为空,则将P入栈并将P的左孩子置为当前的P,然后对当前结点P再进行相同的处理;
	 * 
	 * 2)若其左孩子为空,则取栈顶元素并进行出栈操作,访问该栈顶结点,然后将当前的P置为栈顶结点的右孩子;
	 * 
	 * 3)直到P为NULL并且栈为空则遍历结束
	 */
	public void InOrder2(BinaryTreeNode node) {
		Stack<BinaryTreeNode> s = new Stack<BinaryTree.BinaryTreeNode>();
		while (node != null || !s.isEmpty()) {
			while (node != null) {
				s.push(node);
				node = node.getlChild();
			}
			while (!s.isEmpty()) {
				node = s.pop();
				System.out.print(node.getData() + " ");
				node = node.getrChild();
			}
		}
	}

	/**
	 * 后序遍历 要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;
	 * 或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。若非上述两种情况,则将P的右孩子和左孩子依次入栈,
	 * 这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。
	 * 
	 */
	public void PostOrder2(BinaryTreeNode node) {
		Stack<BinaryTreeNode> s = new Stack<BinaryTree.BinaryTreeNode>();
		BinaryTreeNode cur;
		BinaryTreeNode pre = null;
		s.push(node);
		while (!s.isEmpty()) {
			cur = s.peek();
			if ((cur.getlChild() == null && cur.getrChild() == null)
					|| (pre != null && (pre == cur.getlChild() || pre == cur
							.getrChild()))) {
				System.out.print(cur.getData() + " ");
				s.pop();
				pre = cur;
			} else {
               if(cur.getrChild()!=null){
            	   s.push(cur.getrChild());
               }
               if(cur.getlChild()!=null){
            	   s.push(cur.getlChild());
               }
			}
		}
	}
   
	public static void main(String args[]){
		String  expression = "A(B(D(,G)),C(E,F))";
		BinaryTreeNode node = BinaryTree.createTree(expression);
		BinaryTree binaryTree  = new BinaryTree();
		System.out.println("前序遍历");
		binaryTree.PreOrder(node);
		System.out.println();
		binaryTree.PreOrder2(node);
		System.out.println("中序遍历");
		binaryTree.InOrder(node);
		System.out.println();
		binaryTree.InOrder2(node);
		System.out.println("后序遍历");
		binaryTree.PostOrder(node);
		System.out.println();
		binaryTree.PostOrder2(node);
	}
	
	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
平衡二叉树(AVL树)是一种自平衡的二叉搜索树,它的左子树和右子树的高度差不超过1。在Java中,可以通过以下步骤实现平衡二叉树: 1. 定义节点类:首先定义一个节点类,包含节点值、左子节点和右子节点等属性。 ```java class Node { int value; Node left; Node right; public Node(int value) { this.value = value; this.left = null; this.right = null; } } ``` 2. 实现平衡二叉树类:创建一个平衡二叉树类,包含插入节点、删除节点、旋转操作等方法。 ```java class AVLTree { private Node root; // 插入节点 public void insert(int value) { root = insertNode(root, value); } private Node insertNode(Node root, int value) { if (root == null) { return new Node(value); } if (value < root.value) { root.left = insertNode(root.left, value); } else if (value > root.value) { root.right = insertNode(root.right, value); } else { // 如果存在相同值的节点,可以根据需求进行处理 return root; } // 更新节点的高度 root.height = 1 + Math.max(getHeight(root.left), getHeight(root.right)); // 平衡操作 int balance = getBalance(root); // 左左情况,进行右旋操作 if (balance > 1 && value < root.left.value) { return rightRotate(root); } // 右右情况,进行左旋操作 if (balance < -1 && value > root.right.value) { return leftRotate(root); } // 左右情况,先左旋再右旋 if (balance > 1 && value > root.left.value) { root.left = leftRotate(root.left); return rightRotate(root); } // 右左情况,先右旋再左旋 if (balance < -1 && value < root.right.value) { root.right = rightRotate(root.right); return leftRotate(root); } return root; } // 删除节点 public void delete(int value) { root = deleteNode(root, value); } private Node deleteNode(Node root, int value) { // 空树或未找到节点 if (root == null) { return root; } if (value < root.value) { root.left = deleteNode(root.left, value); } else if (value > root.value) { root.right = deleteNode(root.right, value); } else { // 找到要删除的节点 // 节点只有一个子节点或无子节点 if (root.left == null || root.right == null) { Node temp = null; if (temp == root.left) { temp = root.right; } else { temp = root.left; } // 无子节点的情况 if (temp == null) { temp = root; root = null; } else { // 一个子节点的情况 root = temp; } } else { // 节点有两个子节点,找到右子树中最小的节点 Node temp = minValueNode(root.right); // 将右子树中最小节点的值赋给要删除的节点 root.value = temp.value; // 删除右子树中最小的节点 root.right = deleteNode(root.right, temp.value); } } // 更新节点的高度 root.height = 1 + Math.max(getHeight(root.left), getHeight(root.right)); // 平衡操作 int balance = getBalance(root); // 左左情况,进行右旋操作 if (balance > 1 && getBalance(root.left) >= 0) { return rightRotate(root); } // 左右情况,先左旋再右旋 if (balance > 1 && getBalance(root.left) < 0) { root.left = leftRotate(root.left); return rightRotate(root); } // 右右情况,进行左旋操作 if (balance < -1 && getBalance(root.right) <= 0) { return leftRotate(root); } // 右左情况,先右旋再左旋 if (balance < -1 && getBalance(root.right) > 0) { root.right = rightRotate(root.right); return leftRotate(root); } return root; } // 获取节点的高度 private int getHeight(Node node) { if (node == null) { return 0; } return node.height; } // 获取节点的平衡因子 private int getBalance(Node node) { if (node == null) { return 0; } return getHeight(node.left) - getHeight(node.right); } // 右旋操作 private Node rightRotate(Node y) { Node x = y.left; Node T2 = x.right; x.right = y; y.left = T2; y.height = Math.max(getHeight(y.left), getHeight(y.right)) + 1; x.height = Math.max(getHeight(x.left), getHeight(x.right)) + 1; return x; } // 左旋操作 private Node leftRotate(Node x) { Node y = x.right; Node T2 = y.left; y.left = x; x.right = T2; x.height = Math.max(getHeight(x.left), getHeight(x.right)) + 1; y.height = Math.max(getHeight(y.left), getHeight(y.right)) + 1; return y; } // 获取最小值节点 private Node minValueNode(Node node) { Node current = node; while (current.left != null) { current = current.left; } return current; } } ``` 以上是一个简单的平衡二叉树Java实现,包括插入节点、删除节点、旋转操作等方法。你可以根据需要进行调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值