JAYU_37
米兰的小铁匠z
采纳率50%
2019-01-30 15:01 阅读 651
已采纳

二叉树递归的销毁(Java)

代码附上:
/**
* 销毁二叉树
*
*/
BiTree DestroyBiTree(BiTree T) {
if (T != null) {
if (T.lchild != null) {
T.lchild = DestroyBiTree(T.lchild);
}
if (T.rchild != null) {
T.rchild = DestroyBiTree(T.rchild);
}
T = null;
}
return T;
}

public class BiTree {
    char data;
    BiTree lchild, rchild;
    }

问题出在不知道如何释放根节点的内存,这样子虽然最后return null了,根节点的左右孩子也都为null,了,但是根节点的数据一直都还在,特来请教,想在函数里面做一些修改

全部代码:
package bitree;

public class BiTree {
char data;
BiTree lchild, rchild;

/**
 * 创建二叉树
 */
int index = 0;

BiTree CreateBiTree(BiTree node, String str) {
    char ch;
    if (index < str.length()) {
        ch = str.charAt(index);
        index++;
    } else {
        return null;
    }
    if (ch == '#') {
        node = null;
    } else {
        if (node == null)
            node = new BiTree();
        node.data = ch;
        node.lchild = CreateBiTree(node.lchild, str);
        node.rchild = CreateBiTree(node.rchild, str);
    }
    return node;
}

/**
 * 判断二叉树是否为空
 */
int EmptyBiTree(BiTree node) {
    if (node == null)
        return 1;
    return 0;
}

/**
 * 求树的深度
 */
int DepthBiTree(BiTree node) {
    int i = 0, j = 0;
    if (node == null)
        return 0;
    if (node.lchild != null) {
        i = DepthBiTree(node.lchild);
    } else {
        i = 0;
    }
    if (node.rchild != null) {
        j = DepthBiTree(node.rchild);
    } else {
        j = 0;
    }

    return i > j ? (i + 1) : (j + 1);
}

/**
 * 先序遍历
 */
void PreOrderTraverse(BiTree T) {
    if (T == null)
        return;
    System.out.println(T.data);
    PreOrderTraverse(T.lchild);
    PreOrderTraverse(T.rchild);
}

/**
 * 中序遍历
 */
void InOrderTraverse(BiTree T) {
    if (T == null)
        return;
    InOrderTraverse(T.lchild);
    System.out.println(T.data);
    InOrderTraverse(T.rchild);
}

/**
 * 后序遍历
 */
void PostOrderTraverse(BiTree T) {
    if (T == null)
        return;
    PostOrderTraverse(T.lchild);
    PostOrderTraverse(T.rchild);
    System.out.println(T.data);
}

/**
 * 销毁二叉树
 * 
 */
BiTree DestroyBiTree(BiTree T) {
    if (T != null) {
        if (T.lchild != null) {
            T.lchild = DestroyBiTree(T.lchild);
        }
        if (T.rchild != null) {
            T.rchild = DestroyBiTree(T.rchild);
        }
        T = null;
    }
    return T;
}

}


package bitree;

public class Test {

public static void main(String[] args) {

    BiTree T = new BiTree(); // 初始化节点

    T.CreateBiTree(T, "ABDH#K###E##CFI###G#J##");

    System.out.println("树的深度:" + T.DepthBiTree(T));

    System.out.println("销毁二叉树..");
    T.DestroyBiTree(T);
    // T = null;
    System.out.println("树的深度:" + T.DepthBiTree(T));
    System.out.println("");
}

}
这边的求出的深度不为0,

表示我的根节点并没有释放成功,求解?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

1条回答 默认 最新

  • 已采纳
    qq_35654259 echo_wjcwjc 2019-01-30 16:06

    只有BiTree我创建不出树来。你是怎么创建的

    下面的代码我和你的destory一样。

    我这边假设创建了只有根节点为4的树

    图片说明

    不知道这样讲是否好一些。

    在看不懂你可以看一下下面这个例子
    图片说明

    点赞 评论 复制链接分享

相关推荐