标签:
递归
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