本来想定义文章为转载的,但是我忘记了参考哪些博主的(很久之前练习的),但是大部分都是参考的小甲鱼视频的,在此对参考的博主说声抱歉。
再次说明,以下的代码主要是根据小甲鱼数据结构视频(b站上有)中所讲的去写的,和视频的代码没有多大区别(但都是自己理解之后去写的,还补充了一些,但也参考了一些博主,具体的我也给忘记了,所以若和谁代码重复请告诉我,我及时删除),主要是为了我自己练手的。网上版本较多,我觉得我写的这个比较好理解?(别打脸)
开始之前,先回忆一下二叉树的三种遍历方式。
前序遍历:根结点 —> 左子树 —> 右子树(先遍历根节点,然后左右)
这棵树的前序遍历为:ABDEGHCF
中序遍历:左子树—> 根结点 —> 右子树(在中间遍历根节点)
这棵树的中序遍历为:DBGEHACF
后序遍历:左子树 —> 右子树 —> 根结点(最后遍历根节点)
这棵树的后序遍历为:DGHEBFCA
具体参考这位博主吧`
https://blog.csdn.net/qq_42651904/article/details/90288715
// Created by xiaobinbin on 2020/3/17.
// Copyright © 2020 xiaobinbin. All rights reserved.
//强调的是,引用很关键,品,你细品~
#include <iostream>
using namespace std;
template<class T>
class TreeNode{
public:
T key;
TreeNode* lchild;
TreeNode* rchild;
TreeNode(){
lchild=NULL;
rchild=NULL;
}//日常好习惯,随手构造函数一下。在涉及到有指针的成员时,最好重写拷贝构造函数,=重载,防止多重析构
};
//中序遍历
template <class T>
void TreeinOrder(TreeNode<T>* bt){
if(bt){
TreeinOrder(bt->lchild);
cout<<bt->key<<" ";
TreeinOrder(bt->rchild);
}
}
//查找,返回TreeNode*
template<class T>
TreeNode<T>* Search(TreeNode<T>* bt,T k,TreeNode<T>* &p)//注意这里的引用呦,这里的p主要就是记录最后查找的位置
{
TreeNode<T>* q=NULL;
q=bt;
while(q){
p=q;
if(q->key==k)
return p;
else if(q->key>k)
q=q->lchild;
else
q=q->rchild;
}
return NULL;
}
//插入
template<class T>
void TreeInsert(TreeNode<T>* &bt,T k){
TreeNode<T>* p=NULL,*q;
q=bt;
if(Search(q, k, p)==NULL){
//查找失败才插入,p主要是为了记录最后一次查找的位置
TreeNode<T> *r= new TreeNode<T>;
r->key=k;
r->rchild=r->lchild=NULL;
if(q==NULL){
//根结点为空
bt=r;
return;
}
if