java数据算法节点删除_二叉树 BinaryTree (先序、中序、后序遍历 节点查找、插入、删除 完整类) Java数据结构与算法...

/**

*

* @author sunnyykn

*/

importjava.io.*;

importjava.util.*;

classNode

{

publicintiData;//data item (key)

publicdoubledData;//data item

publicNode leftChild;//this node's left child

publicNode rightChild;//this node's right child

publicvoiddisplayNode()//display ourself

{

System.out.print("{");

System.out.print(iData);

System.out.print(",");

System.out.print(dData);

System.out.print("}");

}

}//end class Node

classTree

{

privateNode root;//first node of tree

publicTree()

{

root = null;//no nodes in tree yet

}

publicNode find(intkey)//find node with given key

{

Node current = root;        //start at root

while(current.iData != key)//while no match

{

if(key 

current = current.leftChild;

else//go right?

current = current.rightChild;

if(current ==null)//didn't find it

returnnull;

}

returncurrent;

}//end find()

publicvoidinsert(intid ,doubledd)

{

Node newNode = newNode();//make new node

newNode.iData = id;             //insert data

newNode.dData = dd;

if( root ==null)//no node in root

root = newNode;

else

{

Node current = root;        //start at root

Node parent;

while(true)

{

parent = current;

if(id 

{

current = current.leftChild;

if(current ==null)//if end of the line

{

parent.leftChild = newNode;

return;

}

}//end if go left

else//or go right

{

current = current.rightChild;

if(current ==null)//if end of the line

{

parent.rightChild = newNode;

return;

}

}//end else go right

}//end while

}//end else not root

}//end insert()

publicbooleandelete(intkey)//delete node with given key

{

Node current = root;

Node parent = root;

booleanisLeftChild =true;

while(current.iData != key)

{

parent = current;

if(key 

{

isLeftChild = true;

current = current.leftChild;

}

else

{

isLeftChild = false;

current = current.rightChild;

}

if(current ==null)

returnfalse;

}//end while

//found node to delete

//if no children , simply delete it

if(current.leftChild ==null&& current.rightChild ==null)

{

if(current == root)

root = null;

elseif(isLeftChild)

parent.leftChild = null;

else

parent.rightChild = null;

}

//if no right child , replace with left subtree

elseif(current.rightChild ==null)

{

if(current == root)

root = current.leftChild;

elseif(isLeftChild)

parent.leftChild = current.leftChild;

else

parent.rightChild = current.leftChild;

}

//if no left child , replace with right subtree

elseif(current.leftChild ==null)

{

if(current == root)

root = current.rightChild;

elseif(isLeftChild)

parent.leftChild = current.rightChild;

else

parent.rightChild = current.rightChild;

}

//two children,so replace with inorder successor

else

{

//get successor of node to delete(current)

Node successor = getSuccessor(current);

//connect parent of current to successor insteed

if(current == root)

root = successor;

elseif(isLeftChild)

parent.leftChild = successor;

else

parent.rightChild = successor;

//connect successor to current's left child

successor.leftChild = current.leftChild;

}//end else two children

//(successor cannot have a left child)

returntrue;

}//end delete()

//return node with next-highest value after delNode

//goes to right child , then right child's left descendents

privateNode getSuccessor(Node delNode)

{

Node successorParent = delNode;

Node successor = delNode;

Node current = delNode.rightChild;      //go to right child

while(current !=null)//until no more left children

{

successorParent = successor;

successor = current;

current = current.leftChild;        //go to left child

}

if(successor != delNode.rightChild)//if successor not right child , make connections

{

successorParent.leftChild = successor.rightChild;

successor.rightChild = delNode.rightChild;

}

returnsuccessor;

}

publicvoidtraverse(inttraverseType)

{

switch(traverseType)

{

case1:

System.out.print("/nPreorder traversal:");

preOrder(root);

break;

case2:

System.out.print("/nInorder traversal: ");

inOrder(root);

break;

case3:

System.out.print("/nPostorder traversal:");

postOrder(root);

break;

}

System.out.println("");

}

privatevoidpreOrder(Node localRoot)

{

if(localRoot !=null)

{

System.out.print(localRoot.iData + " ");

preOrder(localRoot.leftChild);

preOrder(localRoot.rightChild);

}

}

privatevoidinOrder(Node localRoot)

{

if(localRoot !=null)

{

inOrder(localRoot.leftChild);

System.out.print(localRoot.iData + " ");

inOrder(localRoot.rightChild);

}

}

privatevoidpostOrder(Node localRoot)

{

if(localRoot !=null)

{

postOrder(localRoot.leftChild);

postOrder(localRoot.rightChild);

System.out.print(localRoot.iData + " ");

}

}

publicvoiddisplayTree()

{

Stack globalStack = newStack();

globalStack.push(root);

intnBlanks =32;

booleanisRowEmpty =false;

System.out.println("....................................................");

while(isRowEmpty ==false)

{

Stack localStack = newStack();

isRowEmpty = true;

for(intj =0;j 

System.out.print(" ");

while(globalStack.isEmpty() ==false)

{

Node temp = (Node)globalStack.pop();

if(temp !=null)

{

System.out.print(temp.iData);

localStack.push(temp.leftChild);

localStack.push(temp.rightChild);

if(temp.leftChild !=null|| temp.rightChild !=null)

isRowEmpty = false;

}

else

{

System.out.print("--");

localStack.push(null);

localStack.push(null);

}

for(intj =0; j 

System.out.print(" ");

}//end while globalStack not empty

System.out.println("");

nBlanks /= 2;

while(localStack.isEmpty() ==false)

globalStack.push( localStack.pop() );

}//end while isRowEmpty is false

System.out.println("....................................................");

}//end displayTree()

}//end class Tree

classTreeApp

{

publicstaticvoidmain(String[] args)throwsIOException

{

intvalue ;

Tree theTree = newTree();

theTree.insert(50,1.5);

theTree.insert(25,1.2);

theTree.insert(75,1.7);

theTree.insert(12,1.5);

theTree.insert(37,1.2);

theTree.insert(43,1.7);

theTree.insert(30,1.5);

theTree.insert(33,1.2);

theTree.insert(87,1.7);

theTree.insert(93,1.5);

theTree.insert(97,1.5);

while(true)

{

System.out.print("Enter first letter of show,insert,find,delete,or traverse:");

intchoice = getChar();

switch( choice )

{

case's':

theTree.displayTree();

break;

case'i':

System.out.print("Enter value to insert:");

value = getInt();

theTree.insert(value, value + 0.9);

break;

case'f':

System.out.print("Enter value to find:");

value = getInt();

Node found = theTree.find(value);

if(found !=null)

{

System.out.print("Found:");

found.displayNode();

System.out.print("/n");

}

else

{

System.out.print("Could not find ");

System.out.print(value + '/n');

}

break;

case'd':

System.out.print("Enter value to delete:");

value = getInt();

booleandidDelete = theTree.delete(value);

if(didDelete)

System.out.print("Deleted "+ value +'/n');

else{

System.out.print("Could not delete ");

System.out.print(value + '/n');

}

break;

case't':

System.out.print("Enter type 1,2 or 3:");

value = getInt();

theTree.traverse(value);

break;

default:

System.out.print("Invalid entry/n");

}//end switch

}//end while

}//end main()

publicstaticString getString()throwsIOException

{

InputStreamReader isr = newInputStreamReader(System.in);

BufferedReader br = newBufferedReader(isr);

String s = br.readLine();

returns;

}

publicstaticchargetChar()throwsIOException

{

String s = getString();

returns.charAt(0);

}

publicstaticintgetInt()throwsIOException

{

String s = getString();

returnInteger.parseInt(s);

}

}//end class TreeApp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值