二叉树遍历

来源:互联网 发布:影音后期制作软件大全 编辑:程序博客网 时间:2024/05/24 22:42

定义:n个节点的有限集合,由一个根节点以及两棵互补相交的,分别为左子树和右子树的二叉树组成。

基本特征:每个节点最多有两个子树,左子树和右子树次序不能颠倒(有序树),深度为k的二叉树,至多有pow(2,k)个节点;对于任何一颗二叉树,若度为2的节点有n2个,则叶子数必定为n2+1,具有n个节点的完全二叉树的深度必为log(2,n)+1,对完全二叉树,若从上至下、从左至右编号,则编号为i的节点,其左孩子编号必为2i,右孩子的编号必为2i+1,其双亲的编号必为i/2(i=1时为根,除外)

二叉树节点的定义:

typedef struct Node

{

int data;

struct Node *left,*right;

};

-------------------------------------------------------

二叉树的递归遍历和非递归遍历

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdlib>
#include<stack>
using namespace std;
struct Node
{
int data;
struct Node *left, *right;
};
//递归遍历
void recursion(Node* root)
{
if (root == NULL)
{
return;
}
//后续遍历
recursion(root->left);
recursion(root->right);
std::cout << root->data<<std::endl;
/*
//前序遍历
std::cout << root->data<<std::endl;
recursion(root->left);
recursion(root->right);
*/
/*
//中序遍历
recursion(root->left);
std::cout << root->data<<std::endl;
recursion(root->right);
*/
}
//非递归遍历
struct sNode
{
bool flag;
Node* node;
};
sNode* createsNode(Node* node,bool flg)
{
sNode* snode=(sNode*)malloc(sizeof(sNode));
snode->node = node;
snode->flag = flg;
return snode;
}
void norecursion(Node* root)
{
stack<sNode*> s;
//根节点入栈
sNode* snode = createsNode(root, false);
s.push(snode);
while (s.size() > 0)
{
//获得栈顶元素
sNode* tmpsNode = s.top();
s.pop();
if (tmpsNode->flag)
{
cout << tmpsNode->node->data << endl;
free(tmpsNode);
tmpsNode = NULL;
continue;
}
//右子树入栈
if (tmpsNode->node->right != NULL)
{
s.push(createsNode(tmpsNode->node->right, false));
}
//根节点入栈
tmpsNode->flag = true;
s.push(tmpsNode);
//左子树入栈
if (tmpsNode->node->left != NULL)
{
s.push(createsNode(tmpsNode->node->left,false));
}
}
}
int main()
{
//创建一个二叉树
Node* root = NULL;
Node n0, n1, n2, n3, n4, n5;
n0.data = 0;n1.data = 1;n2.data = 2;n3.data = 3;n4.data = 4;n5.data = 5;
n0.left = &n1;n0.right = &n2;
n1.left = &n3;n1.right = &n4;
n2.right = &n5;
n3.left = NULL;n3.right = NULL;
n4.left = NULL;n4.right = NULL;
n2.left = NULL;
n5.left = NULL;n5.right = NULL;
root = &n0;
norecursion(root);
system("pause");
return 0;
}


原创粉丝点击