算法学习记录(十二)

138 阅读2分钟

二叉树

问:

  1. 给定一个树的头结点Head、和两个节点node1,node2。如何找到这两个节点的最低公共祖先节点。不使用额外空间
  2. 假设一个树中每一个节点都有一个属性father指向它的父节点,如何最快速求一个节点的后继节点。
  3. 假设有一个纸条,对折一次,折痕是凹折痕,对折两次,从上到下分别是凹、凹、凸折痕。请问对折N次,从上到下的折痕是什么样的

解:

  1. 如果递归的过程中,遇到node1或者node2就返回这个节点反则返回null。如果只获取到了其中一个节点,那么这个节点就是最低公共祖先。如果两个节点都获取到了,那么把这两个节点一直往上收,直到某个节点同时有左右子树的值,这个节点就是最低公共祖先。
    function getPublicAncestors (head: Node, node1: Node, node2: Node): Node {
        function orderTree(node: Node): Node | null {
            if (!node || node === node1 || node === node2) {
                return node
            }
            const left = orderTree(node.left)
            const right = orderTree(node.right)
            if (left && right) return node
            return left ? left : right
        }
        return orderTree(head)
    }
  1. 后继节点即中序遍历的当前节点的下一个节点。判断当前节点是否有右子树,如果存在右子树,那么后继节点就是右子树的最左节点;如果不存在右子树,那么判断当前节点是否是父节点的左节点,如果不是就把当前节点赋值为父节点,继续判断,是的话这个父节点就是当前节点的后继节点
    function getSuccessorNode(node:{ left: Node, right: Node, father: Node }): Node {
        let curNode = node
        if (curNode.right) {
            curNode = curNode.right
            while (curNode.left) {
                curNode = curNode.left
            }
            return curNode
        }
        while (curNode !== curNode.father.left) {
            curNode = curNode.father
        }
        return curNode.father
    }
  1. 对折一次出现凹折痕,命名为一凹,对折两次,一凹折痕上方出现一个凹折痕,下方出现一个凸折痕,命名为二凹,二凸。对折三次,二凹折痕上下方继续出现一个凹一个凸折痕,二凸折痕上下方出现一个凸折痕一个凹折痕。
    //                               一凹
    //                     二凹                   二凸
    //               三凹         三凸       三凸        三凹
    //           四凹   四凸   四凸    四凹 四凸  四凹   四凹  四凸
    // 从上到下就是该二叉树的中序遍历结果
    // 设定折叠次数N,以及头节点类型type: 0表示凹,1表示凸,从第1层开始递归
    function creaseTree(count: number, type: number, N: number) {
        if (count > N) {
            return
        }
        creaseTree(count + 1, type ? 1 : 0, N) // 左树
        console.log(type === 0 ? '凹' : '凸');
        creaseTree(count + 1, type ? 0 : 1, N) // 右树
    }
    function print(N: number) {
        creaseTree(1, 0, N)
    }