首页 > 技术文章 > 二叉树相关面试题(二)

daimingming 2013-08-17 17:03 原文

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

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);
}

 

 

推荐阅读