二叉树
 
每个节点最多有两颗子树,即度 <= 2, 有序树 
性质
 
二叉树的第i层上最多有2^i个节点,i从0开始;深度为k的二叉树上至多有2^(k+1) - 1个节点,k从0开始;当前节点编号为i,则其子节点(如果有)为2i+1和2i+2; 
完全二叉树
 
叶子节点只在最大两层出现;  对于任一节点,其右侧分支最大层次为l,则左分支为l或者l+1
 
满二叉树
 
深度为k且有2^(k+1) - 1个节点的二叉树
 
树的节点
 
struct BiTreeNode {
    char data;
    BiTreeNode 
*lChild;
    BiTreeNode 
*rChild;
    BiTreeNode 
*Parent;
}; 
前序遍历
 
递归解决
 
void BiTree
::PreTraverse(BiTreeNode 
*root) const {
    
if (root 
!= NULL)
    {
        cout 
<< root
->data;
        PreTraverse(root
->lChild);
        PreTraverse(root
->rChild);
    }
} 
栈解决
 
void BiTree::PreOrderTraverse(BiTreeNode *root) 
const {
    
stack<BiTreeNode *> Tree;
    
while (!Tree.empty() || root != NULL)
    {
        
while (root != NULL)
        {
            
cout << root->data;
            Tree.push(root);
            root = root->lChild;
        }
        root = Tree.top();
        Tree.pop();
        root = root->rChild;
    }
}
 
中序遍历
 
递归解决
 
void BiTree
::InTraverse(BiTreeNode 
*root) const {
    
if (root 
!= NULL)
    {
        InTraverse(root
->lChild);
        cout 
<< root
->data;
        InTraverse(root
->rChild);
    }
} 
栈解决
 
void BiTree::InOrderTraverse(BiTreeNode *root) 
const {
    
stack<BiTreeNode *> Tree;
    
while (!Tree.empty() || root != NULL)
    {
        
while (root != NULL)
        {
            Tree.push(root);
            root = root->lChild;
        }
        root = Tree.top();
        
cout << root->data;
        Tree.pop();
        root = root->rChild;
    }
} 
后序遍历
 
递归解决
 
void BiTree
::PostTraverse(BiTreeNode 
*root) const {
    
if (root 
!= NULL)
    {
        PostTraverse(root
->lChild);
        PostTraverse(root
->rChild);
        cout 
<< root
->data;
    }
} 
栈解决
 
void BiTree::PostOrderTraverse(BiTreeNode *root) 
const {
    
stack<BiTreeNode *> Tree;
    
stack<int> Times; 
    
while (!Tree.empty() || root != NULL)
    {
        
while (root != NULL)
        {
            Tree.push(root);
            Times.push(
0); 
            root = root->lChild;
        }
        
if (Times.top() == 
1) 
        {
            
cout << Tree.top()->data;
            Times.pop(); 
            Tree.pop();
        }
        
else
        {
            root = Tree.top();
            Times.top() = 
1; 
            root = root->rChild;
        }
    }
}