二叉树删除结点思路分析及代码实现

二叉树删除结点

思路分析

完成删除的操作

规定:

  1. 如果删除的结点是叶子节点,则删除该节点
  2. 如果删除的结点是非叶子节点,则删除该子树

思路:

  1. 因为我们的二叉树是单向的,所以我们是判断当前结点的子结点是否需要删除结点,而不能去判断当前这个结点是不是需要删除结点
  2. 如果当前结点的左子结点不为空,并且左子结点就是要删除结点,就将this.left=null;并且就返回(结束递归删除)
  3. 如果当前结点的右子结点不为空,并且右子结点就是要删除结点,就将this.right=null;并且就返回(结束递归删除)
  4. 如果第2和第3步没有删除结点,那么我们就需要向左子树进行递归删除
  5. 如果第4步也没有删除结点,则应当向右子树进行递归删除。
  6. 如果考虑树是空树root,如果只有一个root结点,则等价将二叉树置空

代码实现

删除方法delNode(int no):

// 递归删除结点
	// 1. 如果删除的结点是叶子节点,则删除该节点
	// 2. 如果删除的结点是非叶子节点,则删除该子树
	public void delNode(int no) {
		// 思路:
		// 1. 因为我们的二叉树是单向的,所以我们是判断当前结点的子结点是否需要删除结点,而不能去判断当前这个结点是不是需要删除结点
		// 2. 如果当前结点的左子结点不为空,并且左子结点就是要删除结点,就将this.left=null;并且就返回(结束递归删除)
		// 3. 如果当前结点的右子结点不为空,并且右子结点就是要删除结点,就将this.right=null;并且就返回(结束递归删除)
		// 4. 如果第2和第3步没有删除结点,那么我们就需要向左子树进行递归删除
		// 5. 如果第4步也没有删除结点,则应当向右子树进行递归删除。
		// 6. 如果考虑树是空树root,如果只有一个root结点,则等价将二叉树置空
		// 2. 如果当前结点的左子结点不为空,并且左子结点就是要删除结点,就将this.left=null;并且就返回(结束递归删除)
		if (this.left != null && this.left.no == no) {
			this.left = null;
			return;
		}
		// 3. 如果当前结点的右子结点不为空,并且右子结点就是要删除结点,就将this.right=null;并且就返回(结束递归删除)
		if (this.right != null && this.right.no == no) {
			this.right = null;
			return;
		}
		// 4.先左子树进行递归删除
		if (this.left != null) {
			this.left.delNode(no);
		//	return
		}
		// 5.向右子树递归删除
		if (this.right != null) {
			this.right.delNode(no);
		}
	}

delNode(int no)方法的实现:

//删除结点
	public void delNode(int no) {
		if (root!=null) {
			//如果只有一个root结点,立即判断root是不是要删除的结点
			if(root.getNo()==no) {
				root=null;
			}else {
				//递归删除
				root.delNode(no);
			}
		}else {
			System.out.println("空树,不能删除");
		}
	}
posted @ 2020-01-13 09:33  额头有王的喵  阅读(460)  评论(0编辑  收藏  举报