static final int MAXLEN = 20; //最大長度 class CBTType //定義二叉樹節點類型 { String data; //元素數據 CBTType left; //左子樹節點引用 CBTType right; //右子樹節點引用 } CBTType InitTree() //初始化二叉樹 { CBTType node; if((node=new CBTType())!=null){ //申請內存 System.out.println("請輸入根節點數據"); node.data=input.next(); node.left=null; node,right=null; if(node!=null) { return node; } else { return null; } } return null; } void AddTreeNode(CBTType treeNode) //添加節點 { CBTType pnode,parent; String data; int menusel; if((pnode=new CBTType())!=null) { System.out.println("輸入二叉樹結點數據"); pnode.data=input.next(); pnode.left=null; pnode,right=null; System.out.println("輸入該節點父節點的數據"); data=input.next(); parent=TreeFindNode(treeNode,data); if(parent==null) { System.out.prinln("未找到父節點"); return; } System.out.println("1.插入到父節點左子樹 2.插入到父節點右子樹");\ do { menusel=input.neitInt(); if(menusel==1||menusel==2) { if(parent==null) { System.out.prinln("父節點不存在,請先設置父節點"); } else { switch(menusel) { case 1: if(parent.left!=null) { System.out.prinln("左子樹節點不為空"); } else { parent.left=pnode; } break; case 2: if(parent.right!=null) { System.out.prinln("右子樹節點不為空"); } else { parent.right=pnode; } break; default: System.out.println("無效參數"); } } }while(menusel!=1&&menusel!=2); } } CBTType TreeFindNode(CBTType treeNode,String data) // 查找節點 { CBTType ptr; if(treeNode==null) { return null; } else { if(treeNode.data.equals(data)) { return treeNode } else { if((ptr=TreeFindNode(treeNode.left,data))!==null) //遞歸左子樹 { return ptr; } else if((ptr=TreeFindNode(treeNode.right))!==null) // 遞歸右子樹 { return ptr; } else { return null; } } } } CBTType TreeLeftNode(CBTType treeNode) //獲取左子樹 { if(treeNode!=null) { return treeNode.left; } else { return null; } } CBTType TreeRightNode(CBTType treeNode) //獲取右子樹 { if(treeNode!=null) { return treeNode.right; } else { return null; } } int TreeIsEmpty(CBTType treeNode) //判斷空樹 { if(treeNode==null) { return 1; } else { return 0; } } int TreeDepth(CBTType treeNode) //計算二叉樹深度 { int depleft,depright; if(treeNode==null) { return 0; } else { depleft=TreeDepth(treeNode.left); //左子樹深度遞歸 depright=TreeDepth(treeNode.right); //右子樹深度遞歸 if(depleft>depright) { return depleft+1; } else { return depright+1; } } } void ClearTree(CBTType treeNode) //清空二叉樹 { if(treeNode!=null) { ClearTree(treeNode.left); ClearTree(treeNode.right); treeNode=null; } } void TreeNodeData(CBTType p) //顯示當前節點數據 { System.out.prinln("%s",p.data); } void LevelTree(CBTType treeNode) //層次遍歷 { CBTType p; CBTType[] q=new CBTType[MAXLEN]; //定義隊列 int head= 0; int tail= 0; if(treeNode!=null) { tail=(tail+1)%MAXLEN; //計算循環隊列尾序號 q[tail]=treeNode; //將二叉樹根引進隊列 } while(head!=tail) //隊列不為空 進行循環 { head=(head+1)%MAXLEN; p=q[head]; TreeNodeData(p); if(p.left!=null) { tail=(tail+1)%MAXLEN; q[tail]=p.left; } if(p.right!=null) { tail=(tail+1)%MAXLEN; q[tail]=p.left; } } } void DLRTree(CBTType treeNode) //先序遍歷 { if(treeNode!=null) { TreeNodeData(treeNode); //顯示節點數據 DLRTree(treeNode.left); DLRTree(treeNode,right); } } void LDRTree(CBTType treeNode) //中序遍歷 { if(treeNode!=null) { LDRTree(treeNode.left); TreeNodeData(treeNode); LDRTree(treeNode,right); } } void LRDTree(CBTType treeNode) //后序遍歷 { if(treeNode!=null) { LRDTree(treeNode.left); LRDTree(treeNode.right); TreeNodeData(treeNode); } }
