zoukankan      html  css  js  c++  java
  • 二叉树的下一个节点

      题目来源:《剑指offer》面试题58

      题目:给定一个二叉树和其中一个节点,如何找出中序遍历顺序的下一个节点?树中的节点除了有两个分别指向左右子节点的指针以外,还有一个指向父节点的指针。

      分析:有如下几种情况:

         如果一个节点有右子树,那么它的下一个节点就是它的右子树中的最左子节点。

         如果没有右子树,且它是父节点的左子节点,那么它的下一个节点就是它的父节点。

         如果一个节点即没有右子树,并且它还是父节点的右子节点,这种情况比较复杂。我们可以沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的节点。如果这样的节点存在,那么这个节点的父节点就是我们要找的下一个节点。

         如果一个节点不满足上述所有情况,那么它应该就是中序遍历的最后一个节点。所以返回NULL

    struct BinaryTreeNode {
        int val;
        BinaryTreeNode* parent;
        BinaryTreeNode* left;
        BinaryTreeNode* right;
    };
    
    BinaryTreeNode* GetNext(BinaryTreeNode* root) {
        if (root == NULL) return NULL;
    
        BinaryTreeNode* next_node = NULL;
        //如果节点有右子树,那么它的下一个节点就是它的右子树中最左边的节点
        if (root->right != NULL) {
            next_node = root->right;
            while (next_node->left != NULL) 
                next_node = next_node->left;
            return next_node;
        } 
    
        if (root->parent != NULL) {
            if (root == root->parent->left) {//当前节点是父节点的左子节点
                return root->parent;
            } else {
                BinaryTreeNode* parent_node = root->parent;
                BinaryTreeNode* current_node = root;
                while (parent_node != NULL && current_node == parent_node->left) {
                    current_node = parent_node;
                    parent_node = parent_node->parent;
                }
    
                return parent_node;
            }
        }
    
        return NULL;
    }
  • 相关阅读:
    linux权限掩码
    主机跨网通信时的字节序转换
    鸽巢原理-poj3370
    鸽巢原理
    JS面向对象关键词
    Less 命令技巧,从底部网上看
    软件工程概论第七章
    软件工程概论第八章
    软件工程概论第六章
    软件工程概论第五章
  • 原文地址:https://www.cnblogs.com/vincently/p/4778662.html
Copyright © 2011-2022 走看看