遍历二叉树

二叉树

定义:每个结点最多有两个子树的树

struct TreeNode {
     int val;
     TreeNode *left;
     TreeNode *right;
     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 };

基本操作:

1. 先序遍历 :先访问根节点,在访问左子树,最后访问右子树

void PreOrderVisit(TreeNode *root)
{
    if (root == NULL)
        return;
        
    cout << root->val << endl;
    PreOrderVisit(root->left);
    PreOrderVisit(root->right);
}

2. 中序遍历:先访问左子树,在访问根节点,最后访问右子树

void PreOrderVisit(TreeNode *root)
{
    if (root == NULL)
        return;
        
    PreOrderVisit(root->left);
    cout << root->val << endl;
    PreOrderVisit(root->right);
}

3. 后序遍历:先访问左子树,在访问右子树,最后访问根节点

void PreOrderVisit(TreeNode *root)
{
    if (root == NULL)
        return;
        
    PreOrderVisit(root->left);
    PreOrderVisit(root->right);
    cout << root->val << endl;
}

可见,所谓的前序,中序,后序遍历仅仅是由访问根节点的顺序决定。

4. 层次遍历 : 一层一层访问

 借助一个队列,将每一层的结点都存放于队列中,从队列中取数据。

 那么如何记录一层呢,可以通过记录每层的个数。

void LevelVisit(TreeNode *root)
{
    if (root == NULL)
        return;
        
    deque<TreeNode*> q;
	q.push_back(root);
    
    int levelNum = 0;
	while (!q.empty())
	{
		levelNum = q.size();
		while (levelNum > 0)
		{
			TreeNode *node = q.front();
			q.pop_front();
			levelNum--;

			cout << node->val << " ";

			if (root->left != NULL)
				q.push_back(root->left);
			if (root->right != NULL)
				q.push_back(root->right);
		}
		cout << endl;
	}
} 

5. 求树的高度

int Height(Tree *root)
{
    if (root == NULL)
        return 0;
        
    int lh = Height(root->left);
    int rh = Height(root->right);
    
    return max(lh, rh) + 1;
}

基本操作应该就这些,还是很简单的。

posted @ 2014-05-22 10:40  spch2008  阅读(156)  评论(0)    收藏  举报