一.二叉树的创建
typedef struct TreeNode
{
char data;
struct TreeNode *left;
struct TreeNode *right;
}
1.C语言
void CreateTree(TreeNode **T)
{
char data;
scanf("%d",&data); //输入节点数据
if(data=='#')
*T=NULL; //若为#则代表该节点不存在
else
{
*T=(TreeNode *)malloc(sizeof(TreeNode)); //为该节点开辟内存
(*T)->value=data;//为该节点赋予数据
CreateTree(&((*T)->left));//递归 创建左子节点
CreateTree(&((*T)->right));//递归 创建右子节点
}
}
2.C++
void CreateTree(TreeNode * &T) // C语言采用二级指针 C++则可以使用引用来代替
/*
(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。
(2)可以有const指针,但是没有const引用;
(3)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)
(4)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;
(5)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。
(6)"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小;
(7)指针和引用的自增(++)运算意义不一样;
*/
{
char data;
cin>>data;
if(data=='#')
T=NULL;
else
{
T=new TreeNode;
T->value=data;
CreateTree(T->left);
CreateTree(T->right);
}
}
二.二叉树的三种遍历方式
二叉树定义
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
};
1.前序遍历
vector<int> inorderTraversal(TreeNode* root)
{
vector<int> Node;
FindNode(root,Node);
return Node;
}
void FindNode(TreeNode*root,vector<int>& Node)
{
if(root == NULL)
return;
Node.push_back(root->val);
FindNode(root->left,Node);
FindNode(root->right,Node);
}
2.中序遍历
vector<int> inorderTraversal(TreeNode* root)
{
vector<int> Node;
FindNode(root,Node);
return Node;
}
void FindNode(TreeNode*root,vector<int>& Node)
{
if(root == NULL)
return;
FindNode(root->left,Node);
Node.push_back(root->val);
FindNode(root->right,Node);
}
3.后序遍历
vector<int> inorderTraversal(TreeNode* root)
{
vector<int> Node;
FindNode(root,Node);
return Node;
}
void FindNode(TreeNode*root,vector<int>& Node)
{
if(root == NULL)
return;
FindNode(root->left,Node);
FindNode(root->right,Node);
Node.push_back(root->val);
}