码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树(二)

时间:2016-06-10 16:17:49      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

将二叉查找树变为有序的双向链表(不能创建新节点,只调整指针)

 递归

public TreeNode convertBST2DLLRec(TreeNode root) {
    root = convertBST2DLLSubRec(root);
    // 递归完,root会在链表的中间位置,要把root移到链表头
    while (root.left != null) {
        root = root.left; 
    }
    return root;
}
private TreeNode convertBST2DLLSubRec(TreeNode root) {
    if (root == null || (root.left == null && root.right == null)) {
        return root;
    }

    TreeNode tmp = null;
    if (root.left != null) { // 处理左子树
        tmp = convertBST2DLLSubRec(root.left);
        while (tmp.right != null) { // 寻找最右节点
            tmp = tmp.right;
        }
        tmp.right = root; // 把左子树最右节点和root连接
        root.left = tmp;
    }
    if (root.right != null) { // 处理右子树
        tmp = convertBST2DLLSubRec(root.right);
        while (tmp.left != null) { // 寻找最左节点
            tmp = tmp.left;
        }
        tmp.left = root; // 把右子树最左节点和root连接
        root.right = tmp;
    }
    return root;
}

 非递归

// 类似inorder traversal
public TreeNode convertBST2DLL(TreeNode root) {
    if (root == null) {
        return null;
    }

    Stack<TreeNode> stack = new Stack<TreeNode>();
    TreeNode cur = root; // 指向当前处理节点
    TreeNode old = null; // 指向前一个处理的节点
    TreeNode head = null; // 链表头

    while (true) {
        while (cur != null) {
            stack.push(cur);
            cur = cur.left;
        }

        if (stack.isEmpty()) {
            break;
        }

        cur = stack.pop();

        if (old != null) {
            old.right = cur;
        }
        if (head == null) {
            head = cur;
        }
        old = cur; // 更新old
        cur = cur.right;
    }
    return head;
}

判断二叉树是不是平衡二叉树

 递归

public boolean isAVLRec(TreeNode root) {
    if (root == null) {
        return true;
    }

    // 如果左子树和右子树高度相差大于1,则非平衡二叉树, getDepthRec()是前面实现过的求树高度的方法
    if (Math.abs(getDepthRec(root.left) - getDepthRec(root.right)) > 1) {
        return false;
    }

    return isAVLRec(root.left) && isAVLRec(root.right);
}

二叉树中两个节点的最低公共祖先节点

 递归

/**
 *  求二叉树中两个节点的最低公共祖先节点 递归解法: 
 * (1)如果两个节点分别在根节点的左子树和右子树,则返回根节点
 * (2)如果两个节点都在左子树,则递归处理左子树;如果两个节点都在右子树,则递归处理右子树
 */
public TreeNode getLastCommonParentRec(TreeNode root, TreeNode n1, TreeNode n2) {
    if (findNodeRec(root.left, n1)) { // 如果n1在树的左子树
        if (findNodeRec(root.right, n2)) { // 如果n2在树的右子树
            return root; // 返回根节点
        } else { // 如果n2也在树的左子树
            return getLastCommonParentRec(root.left, n1, n2);
        }
    } else { // 如果n1在树的右子树
        if (findNodeRec(root.left, n2)) { // 如果n2在左子树
            return root;
        } else { // 如果n2在右子树
            return getLastCommonParentRec(root.right, n1, n2);
        }
    }
}

// 帮助方法,递归判断一个节点是否在树里
private static boolean findNodeRec(TreeNode root, TreeNode node) {
    if (root == null || node == null) {
        return false;
    }
    if (root == node) {
        return true;
    }
    boolean found = findNodeRec(root.left, node);
    if (!found) {
        found = findNodeRec(root.right, node);
    }
    return found;
}

非递归

 

二叉树(二)

标签:

原文地址:http://www.cnblogs.com/hesier/p/5573753.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!