zoukankan      html  css  js  c++  java
  • 二叉树相关面试题(二)

    二叉树相关问题,在面试中主要通过递归来实现

    1.二叉树建立

    /**二叉树建立**/
    struct Data
    {
        int val;
    };
    
    typedef struct BiNode 
    {
        Data data;
        BiNode * left;
        BiNode * right;
    }* BiTree;
    
    static BiTree binTree;
    /**先序创建**/
    void CreateBiTree(BiTree * T)
    {
        cout<<"please input; end with #"<<endl;
        Data *data = (Data*)malloc(sizeof(Data));
        cin>>data->val;
        if(data->val == 0)
        {
            (*T) = NULL;
        }else
        {
            (*T) = (BiNode *)malloc(sizeof(BiNode));
            (*T)->data.val = data->val;
            CreateBiTree(&(*T)->left);
            CreateBiTree(&(*T)->right);
        }
        free(data);
    }

    2.二叉树遍历

      先序遍历

    void PreOrderTraverse(BiTree T)
    {
        if(T == NULL)
        {
            return;
        }
        cout<<"val :"<<T->data.val <<endl;
        PreOrderTraverse(T->left);
        PreOrderTraverse(T->right);
    }

      中序遍历

    /**二叉树中序遍历**/
    void InOrderTraverse(BiTree T)
    {
        if(T == NULL)
        {
            return;
        }
        InOrderTraverse(T->left);
        cout<<"val:"<<T->data.val<<endl;
        InOrderTraverse(T->right);
    
    }

      后序遍历

    /**二叉树后序遍历**/
    void PostOrderTraverse(BiTree T)
    {
        if(T != NULL)
        {
            PostOrderTraverse(T->left);
            PostOrderTraverse(T->right);
            cout<<"val:"<<T->data.val<<endl;
        }
    }

    3.二叉树树高

    /**二叉树树高**/
    int BiTreeHeight(BiTree T)
    {
        if(T == NULL)
        {
            return 0;
        }else
        {
            int lHeight = BiTreeHeight(T->left);
            int rHeight = BiTreeHeight(T->right);
            if(lHeight>rHeight)
            {
                return lHeight+1;
            }else
            {
                return rHeight+1;
            }
            return (lHeight>rHeight)?lHeight+1:rHeight+1;
        }
    }

    4.二叉树树叶节点的个数

    /**二叉树树叶节点的个数**/
    int SumOfLeaf(BiTree T)
    {
        if(T == NULL)
        {
            return 0;
        }
        if(T->left==NULL&&T->right==NULL)
        {
            return 1;
        }
        return (SumOfLeaf(T->left)+SumOfLeaf(T->right));
    }

    5.二叉树左右子树交换

    /**二叉树左右子树互换**/
    void SwapChild(BiTree T)
    {
        if((T)==NULL)
        {
            return;
        }
        BiNode *temp = (T)->right;
        (T)->right = (T)->left;
        (T)->left = temp;
        SwapChild((T)->left);
        SwapChild((T)->right);
    }

     6.二叉树按层次遍历(广度优先遍历)

    /**二叉树按层次遍历(广度优先遍历)**/
    void Traverse(BiTree T)
    {
        if(T == NULL)
        {
            return;
        }
        deque<BiNode *> dequeTreeNode;
        dequeTreeNode.push_back(T);
        while(dequeTreeNode.size())
        {
            BiNode * pnode = dequeTreeNode.front();
            dequeTreeNode.pop_front();
            cout<<"traverse val:"<<pnode->data.val<<endl;
            if(pnode->left)
            {
                dequeTreeNode.push_back(pnode->left);
            }
            if(pnode->right)
            {
                dequeTreeNode.push_back(pnode->right);
            }
        
        }
    }

    7.二叉树中和为某一值得路径

    /***二叉树中和为某一值得路径*/
    
    void FindPath(BiTree T,int expectedNum,vector<int>& path,int currentSum)
    {
        currentSum += T->data.val;
        path.push_back(T->data.val);
        bool isLeaf = (T->left==NULL)&&(T->left==NULL);
        if(currentSum == expectedNum&&isLeaf)
        {
            cout<<"A path is found:    "<<endl;
            vector<int>::iterator iter = path.begin();
            for(;iter!=path.end();++iter)
                cout<<(*iter)<<endl;
            cout<<"end"<<endl;
        }
        if(!isLeaf)
        {
            if(T->left!=NULL)
            {
                FindPath(T->left,expectedNum,path,currentSum);
            }
            if(T->right!=NULL)
            {
                FindPath(T->right,expectedNum,path,currentSum);
            }
        }
        path.pop_back();
    }
    
    void FindPath(BiTree T,int expectedNum)
    {
        if(T == NULL)
        {
            return;
        }
        vector<int> path;
        int currentNum = 0;
        FindPath(T,expectedNum,path,currentNum);
    }
  • 相关阅读:
    C++学习之路: share_from_this<T>类的使用
    Linux学习: TCP粘包问题
    C++学习之路: 线程封装(基于对象编程)
    js数组方法
    React 性能优化
    HelloWorld
    设置表格边框的通用写法
    用于项目的SQL写法
    添加服务,用于定期执行某个程序或者应用程序(windows service)
    sql中除法,保留小数点位数
  • 原文地址:https://www.cnblogs.com/daimingming/p/3263896.html
Copyright © 2011-2022 走看看