算法初級03

1. 二叉樹的先序、中序、後序非遞歸遍歷

void preOrder(Node *root)
{
    if(!root)   return ;

    stack<Node *> s;
    s.push(root);

    while(!s.empty())
    {
        Node *node = s.top();
        cout<<node->val<<" ";
        s.pop();

        if(node->right)
            s.push(node->right);
        if(node->left)
            s.push(node->left);
    }
}

void inOrder(Node *root)
{
    if(!root)   return ;

    stack<Node *> s;
    Node *node = s.top();

    while(!s.empty() || node)
    {
        if(node)
        {
            s.push(node);
            node = node->left;
        }else{
            Node *tmp = s.top();
            cout<<tmp->val<<" ";
            s.pop();

            node = node->right;
        }

    }
}

void postOrder(Node *root)  
{
    if(!root)   return ;

    stack<Node *> s;        //中 右  左
    s.push(root);

    stack<Node *> s1;       //左  右  中
    while(!s.empty())
    {
        Node *node = s1.top();
        s1.pop();
        s1.push(node);

        if(node->left)
            s.push(node->left);
        if(node->right)
            s.push(node->right);
    }

    while(!s1.empty())
    {
        Node *node = s1.top();
        cout<<node->val<<" ";
        s1.pop();
    }
}

2.在二叉樹中找到一個節點的後繼節點

後繼:中序遍歷中節點的下一個節點
前驅:中序遍歷中節點的上一個節點

struct Node 
{
    int val;
    Node *parent;
    Node *left;
    Node *right;
};

Node *getSuccessorNode(Node *node)
{
    if(!node)   return NULL;

    if(node->right)
        return getLeftMost(node->right);
    else{
        Node *pNode = node->parent;
        while(!pNode && pNode->left != node)    //!pNode 考慮中序最後一個節點
        {
            node = pNode;
            pNode = node->parent;
        }

        return pNode;
    }
}

Node *getLeftMost(Node *node)
{
    if(!node)   return NULL;

    while(node->left)
        node = node->left;
    
    return node;
}

3.判斷一棵二叉樹是否是平衡二叉樹


class ReturnData
{
public:
    bool isB;
    int height;

    ReturnData(bool isB, int h)
    {
        this.isB = isB;
        this.height = h;
    }
}

bool isBalance(Node *root)
{
    return process(root).isB;
}

ReturnData process(Node *node)
{
    if(!node)   return new ReturnData(true, 0);

    ReturnData lTree = process(node->left);     //判斷左子樹是否平衡
    if(!lTree.isB)
        return new ReturnData(false, 0);
    
    ReturnData rTree = process(node->right);
    if(!rTree.isB)
        return new ReturnData(false, 0);

    if(abs(lTree.height-rTree.height) > 1)
        return new ReturnData(false, 0);
    
    return new ReturnData(true, 1+max(lTree.height, rTree.height));
}

4. 判斷一棵樹是否是完全二叉樹

bool isComplete(Node *root)
{
    if(!root)   return true;

    queue<Node *> q;
    bool state = false;     //若爲true 則之後遍歷到的節點都爲葉子

    q.push(root);
    while(!q.empty())
    {
        Node *node = q.front();
        if( (!node->left&&node->right) || (state && (node->right||node->left)) )
            return false;
        
        if(node->left)
            q.push(node->left);
        if(node->right)
            q.push(node->right);

        if(node->left && !node->right)  //右子樹爲空
            state = true;
    }

    return true;
}

5.已知一棵完全二叉樹,求其節點的個數

int nodeNum(Node *root)
{
    if(!root)   return 0;

    return help(head, 1, mostLeftLevel(head, 1));
}

int mostLeftLevel(Node *node, int h)
{
    while(node && node->left)
    {
        node = node->left;
        h++;
    }

    return h;
}

int help(Node *node, int level, int h)      //返回第level層以node爲根節點的子樹個數
{
    if(level == h)
        return 1;
    
    if(mostLeftLevel(node->right, level) == h)  //右子樹高度達到整棵樹高度,則左子樹爲滿二叉樹
        return (1<<(h-level)) + help(node->right, level+1, h);
    else
        return (1<<(h-level-1)) + help(node->left, levle=1, h);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章