每天进步一点点之树的遍历

树的遍历:

1,前序遍历

void PreOrderTraversal(BinTree T){
    BinTree T_temp = T;
    stack<TreeNode*>    sta;
    while(T_temp || !sta.empty()){
        while(T_temp){
            Print_elm(T_temp->Data);
            sta.push(T_temp);
            T_temp=T_temp->left;
        }
        if(!sta.empty()){
            T_temp=sta.top();
            sta.pop();
            T_temp=T_temp->right;
        }
    }
    
}

2,中序遍历

非递归代码实现如下:

void InOrderTraversal(BinTree T){
    BinTree T_temp = T;
    stack<TreeNode*>    sta;
    while(T_temp || !sta.empty()){
        while(T_temp){
            sta.push(T_temp);
            T_temp=T_temp->left;
        }
        if(!sta.empty()){
            T_temp=sta.top();
            sta.pop();
            Print_elm(T_temp->Data);
            T_temp=T_temp->right;
        }
    }
    
}

3,后序遍历

4,常见问题:

  a,求二叉树的叶子结点数目:

void PreOrderTraversal(BinTree T){
    BinTree BT = T;
    while(BT){
        if(!BT->left && !BT->right)
            Print_elm(BT->Data);
        PreOrderTraversal(BT->left);
        PreOrderTraversal(BT->right);
    }
}

  b,求二叉树的高度:

int PostOrderGetHeight(BinTree BT){
    int HL,HR,MaxH;
    BinTree BT_temp=BT;
    if(BT_temp){
        HL= PostOrderGetHeight(BT_temp->left);
        HR= PostOrderGetHeight(BT_temp->right);
        MaxH = (HL > HR) ? HL : HR;
        return (MaxH + 1); 
    }else return 0;
}

5,考研中考点主要有三个:

  a) 写出该树的前序遍历,中序遍历,后序遍历结果。

  b) 根据已知的遍历序列,写出另外的遍历序列。

  c)根据已知的遍历序列还原树的结构:

    中序遍历必须知晓,前序或者后序知晓一个就行,否则无法确定树结构。

原文地址:https://www.cnblogs.com/lixiangfu/p/13340632.html