二叉查找樹的插入與刪除

定義的二叉樹結構爲:

/*

 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }

 */

建立二叉查找樹時,對根節點的操作與對子節點的操作步驟稍微有點差別,大家可以通過代碼看出來

TreeNode r ;
	public void insertTree(TreeNode root, int x){
		if(root ==null){
			r = new TreeNode(x);//創建父節點
		}
		else{
			if(x <= root.val){
				if(root.left == null){
					root.left = new TreeNode(x);
				}
				else{
					insertTree(root.left,x);
				}
			}
			else{
				if(root.right == null){
					root.right = new TreeNode(x);
				}
				else{
					insertTree(root.right,x);
				}
			}
		}
	}

刪除二叉樹時,分三種情況,當你要刪除的那個節點有三種情況,第一種:要刪除的節點沒有子女;第二種,要刪除的節點只有一個子女;第三種,要刪除的節點有兩個子女;


在這裏刪除5之後應該變成:


刪除13是直接刪除,刪除16是將其父節點指向它的節點指向它的右孩子(具體圖形這裏就不給出了)

public void delete_tree(TreeNode root,int x){
    	 TreeNode q = root ;
    	 TreeNode p = root;
    	 /*
    	  * 先找出要刪除節點的位置
    	  */
    	while(p != null){
    		if(p.val > x){
    			q = p;
    			p = p.left;
    		}
    		else if(p.val < x){
    			q = p;
    			p = p.right;
    		}
    		else{
    			break;
    		}
    	}
    	//當節點沒有子女的時候,應該直接去掉該節點
    	if(p.left == null && p.right == null){
    		if(q.left == p){
    			q.left = null;
    		}
    		else{
    			q.right = null;
    		}
    	}
    	//當節點只有一個子女的時候,應該用其父節點直接指向其子女節點(兩種情況)
    	if(p.left == null && p.right != null ){
    		if(q.left == p){
    			q.left = p.right;
    		}
    		else{
    			q.right = p.right;
    		}
    	}
    	if(p.left != null && p.right == null){
    		if(q.left == p){
    			q.left = p.left;
    		}
    		else{
    			q.right = p.left;
    		}
    	}
    	if(p.left != null && p.right != null){
    		TreeNode tt = Tree_SS(p);//求得p節點的後繼節點
    		delete_tree(root,tt.val);
    		p.val = tt.val;
    	}
     }

關於如何求取後繼節點呢?要求一個二叉查找樹節點的後繼節點,應該要求其右子樹中的最小節點,具體實現這裏就不細說了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章