美文网首页
在二叉树中找到一个节点的后继节点和前驱前驱节点,先序、中序、后序

在二叉树中找到一个节点的后继节点和前驱前驱节点,先序、中序、后序

作者: pipu | 来源:发表于2019-10-30 20:24 被阅读0次

在二叉树中找到一个节点的后继节点和前驱前驱节点,先序、中序、后序遍历的分别实现

【题目】 现在有一种新的二叉树节点类型如下:

Node {
value;
left;
right;
parent;
}
该结构比普通二叉树节点结构多了一个指向父节点的parent指针。假 设有一 棵Node类型的节点组成的二叉树,树中每个节点的parent指针 都正确地指向 自己的父节点,头节点的parent指向null。只给一个在 二叉树中的某个节点 node,请实现返回node的后继节点的函数。在二 叉树的中序遍历的序列中, node的下一个节点叫作node的后继节点。

先序遍历

// 先序遍历中找到节点的后继节点
function getSuccessorNode(node) {
    if (node.left) { // 有左侧节点直接返回左侧节点
        return node.left;
    } else if (node.right) { // 没有左侧节点有右侧节点直接返回右侧节点
        return node.right;
    } else {// 既没有左侧节点也没有右侧节点,找到所属祖先中第一个不是左节点的节点(属于左节点的都被输出过),如果找不到说明该节点已经是最后节点
        let parent = node.parent;
        while (parent !== null && (parent.left !== node || parent.right === null)) {
            node = parent;
            parent = node.parent;
        }
        if (parent) {
            return parent.right;
        }
    }
}


// 先序遍历中找到节点的前驱节点
function getPrecursorNode(node) {
    if (node.parent) { // 不存在是第一个节点
        const parent = node.parent;
        if (parent.left === null || node === parent.left) { // 该节点是父节点的左节点或父节点不存在,遍历父节点
            return parent;
        } else { //该节点是父节点的右侧节点,找到父节点左侧树中的先序遍历最后遍历的节点
            return getFarRightNode(parent.left);
        }
    }
}
function getFarRightNode(node) {
    // 找到先序遍历最后遍历的节点
    while (node.left || node.right) {
        if (node.right) {
            node = node.right;
        } else {
            node = node.left;
        }
    }
    // console.log(node);
    return node;
}


中序遍历

// 中序遍历中的找到节点的后继节点
function getSuccessorNode(node) {
    if (node.right) {
        // 找到右节点树中序最左边的节点
        node = node.right;
        while (node.left) {
            node = node.left;
        }
        // console.log(node);
        return node;
    } else {
        // 找到不一直是右节点的节点,知道根节点
        let curNode = node;
        while (curNode.parent !== null && curNode.parent.right === curNode) {
            curNode = curNode.parent;
        }
        if (curNode.parent) {
            return curNode.parent
        }
    }

}


// 中序遍历的中找到节点的前驱节点
function getPrecursorNode(node) {
    let parent = node.parent;
    if (node.left) {
        // 找到左侧节点树中中序遍历最右边的节点
        node = node.left;
        while (node.right) {
            node = node.right;
        }
        return node
    } else {
        // 祖先节点不是父节点的左侧节点的节点(知道根节点还没找到那就是自己),找到就是给节点的父节点
        while (parent && node === parent.left) {
            parent = parent.parent
        }
        if (parent.parent) {
            return parent
        }
    }
}

后序遍历

// 后序遍历中的找到节点的后继节点
function getSuccessorNode(node) {
    let parent = node.parent;
    if (!parent) {
        return;
    }
    // 如果该节点为父节点的右节点输出父节点 或父节点无右节点
    if (!parent.right || node === parent.right) {
        return parent;
    } else {
        // 如果该节点为父节点的左节点 找到从父节点触发的
        parent = parent.right;
        while (parent.left || parent.right) {
            if (parent.left) {
                parent = parent.left
            } else {
                parent = parent.right
            }
        }
        return parent;
    }

}


// 后序遍历的中找到节点的前驱节点
function getPrecursorNode(node) {
    // 如果有子节点,有右节点返回右节点,否则返回左节点
    if (node.right || node.left) {
        return node.right || node.left
    } else {
        // 没有子节点,找祖先节点中,该节点是父节点的右节点并且父节点含有左节点的节点
        let curNode = node;
        while (curNode.parent && (curNode.parent.left === curNode || curNode.parent.left === null)) {
            curNode = curNode.parent;
        }
        if (curNode.parent) {
            return curNode.parent.left
        }

    }
}


相关文章

  • 在二叉树中找到一个节点的后继节点和前驱前驱节点,先序、中序、后序

    在二叉树中找到一个节点的后继节点和前驱前驱节点,先序、中序、后序遍历的分别实现 【题目】 现在有一种新的二叉树节点...

  • 中序建立线索二叉树

    为什么使用中序遍历来建立线索二叉树? 因为中序遍历方便寻找前驱节点和后继节点,而先序遍历不方便找后继节点,后序遍历...

  • [数据结构与算法-iOS 实现] 二叉树附demo,前序遍历、后

    二叉树附demo,前序遍历、后序遍历、层序遍历、删除一个二叉树的节点,前驱后继节点等概念啊和原理 demo 基本概...

  • 十三、前驱节点(predecessor)&后继节点(succes

    前驱节点(predecessor) 前驱节点:中序遍历时的前一个节点如果是二叉搜索树,前驱节点就是前一个比它小的节...

  • Python数据结构与算法2——双向链表

    双向链表 后继节点:指向下一个节点 前驱节点:指向前一个节点 头节点没有前驱节点,尾节点没有后继节点 实现功能 该...

  • 二叉树

    题目1:画一个10个节点的二叉树,并写出它的先序,中序,后序遍历结果: 先序遍历:(1)访问根节点;(2)...

  • 线性结构-链表

    链表定义 n个节点离散分配 彼此通过指针相连 每个节点只有一个前驱节点,每个节点只有一个后继节点 首节点没有前驱节...

  • 二叉树的前序遍历、中序遍历、后序遍历、层次遍历

    二叉树的遍历方式主要有:先序遍历、中序遍历、后序遍历、层次遍历。先序、中序、后序其实指的是父节点被访问的次序。若在...

  • 树结构中的每个节点有其父节点和子节点: 对于树的遍历,一般有三种,先序遍历,中序遍历和后序遍历: 先序遍历:这里以...

  • 2018-09-07

    树的基本定义: 树是一种非线性结构,有一个直接前驱,可能有很多个后继 根节点:没有前驱结点 叶子节点:没有后继节点...

网友评论

      本文标题:在二叉树中找到一个节点的后继节点和前驱前驱节点,先序、中序、后序

      本文链接:https://www.haomeiwen.com/subject/mzyavctx.html