zoukankan      html  css  js  c++  java
  • c++刷题(18/100)树

    题目1:二叉搜索树的第k个节点

    给定一颗二叉搜索树,请找出其中的第k小的结点。例如, 5 / 3 7 / / 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。

    思路:因为是二叉搜索树,所以左中右的顺序遍历,第k个就是第k小的,用引用记录k的变换,k==0时就找到了第k小的节点

    /*
    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };
    */
    class Solution {
    public:
        TreeNode* findK(TreeNode* pRoot,int &k){
            TreeNode* ans = NULL ;
            if(pRoot->left!=NULL){
                ans = findK(pRoot->left,k) ;
            }
            k-- ;
            if(k==0&&ans==NULL){
                ans = pRoot ;
            }
            if(ans==NULL&&pRoot->right!=NULL){
                ans = findK(pRoot->right,k) ;
            }
            return ans ;
        }
        TreeNode* KthNode(TreeNode* pRoot, int k)
        {
            if(pRoot == NULL || k == 0) return NULL;
            return findK(pRoot,k) ;
        }
    
    };

    题目二:对称的二叉树

    请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
    思路:要判断是不是镜像对称,就是判断左孩子和右孩子是否相等,然后递归他们的后代,记得递归时左右是镜像对应
    /*
    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };
    */
    class Solution {
    public:
        bool isTreeSymmertic(TreeNode* lRoot,TreeNode* rRoot){
            if(lRoot==NULL&&rRoot==NULL){
                return true ;
            }
            if(lRoot==NULL) return false ;
            if(rRoot==NULL) return false ;
            return (lRoot->val==rRoot->val)&&isTreeSymmertic(lRoot->left,rRoot->right)&&isTreeSymmertic(lRoot->right,rRoot->left) ;
        } 
        bool isSymmetrical(TreeNode* pRoot)
        {
            if(pRoot==NULL){
                return true ;
            }
            return isTreeSymmertic(pRoot->left,pRoot->right) ;
        }
    };

    题目三:二叉树的下一个结点

    给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

    思路:主要考中序遍历,中序遍历时左-》中-》右,那么给定一个节点,它可以分成下面几种情况:

    1、有右子树,这时只需要把其右孩子作为下一个遍历的(并不是要找的)节点,然后沿着该节点的左子树(如果有的话)出发,直到遇到叶子节点,那么该叶子节点就是其下一个要找的节点;2、没有右子树,则判断该节点是否是其父节点的左孩子,如果是则其下一个要找的节点是其父节点;3、如果不是其父节点的左孩子,则把其父节点作为下一个遍历的节点,向上回溯,直到找到父节点没有父节点并且父节点是父节点的父节点的左孩子为止。综合这三种情况就可以找到二叉树中任意一个节点的下一个节点。

    /*
    struct TreeLinkNode {
        int val;
        struct TreeLinkNode *left;
        struct TreeLinkNode *right;
        struct TreeLinkNode *next;
        TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
            
        }
    };
    */
    class Solution {
    public:
        TreeLinkNode* find(TreeLinkNode* pNode){
            if(pNode->left!=NULL){
                return find(pNode->left) ;
            }else{
                return pNode ;
            }
        }
        TreeLinkNode* findFather(TreeLinkNode* pNode){
            TreeLinkNode* father ;
            if(pNode->next!=NULL){
                father = pNode->next ;
            }else{
                return NULL ;
            }
            if(father->left==pNode){
                return father ;
            }else{
                return findFather(father) ;
            }
        }
        TreeLinkNode* GetNext(TreeLinkNode* pNode)
        {
            if(pNode==NULL){
                return pNode ;
            }
             if(pNode->right!=NULL){
                 return find(pNode->right) ;
             }else{
                 return findFather(pNode) ;
             }   
        }
    };
  • 相关阅读:
    CodeForces 731A Night at the Museum
    nyoj914 Yougth的最大化
    addEventListener或attachEvent都可以用bind代替
    答疑
    js判断是pc还是手机
    js实现xml转json和json转xml
    js实现xml转json
    margin重叠的解决办法
    去除移动端按钮点击时的阴影和rem标签垂直居中
    关于fiddler https 客户端 抓包配置
  • 原文地址:https://www.cnblogs.com/maskmtj/p/9299502.html
Copyright © 2011-2022 走看看