之前学习的二叉树,都是自顶向下的,仿佛有一种
开弓没有回头箭的感觉,那么是否可以回头呢?
此外,让我们来看看画图表示链式存储
是不是发现,很多 ^ 。这些空指针被闲置了,浪费空间。
所以,我们可以用这些空着的地方,指向某些节点,开弓也有回头箭。
既然要指向某节点,就得遵循一定的规律,这里我们按照此前学习过的“中序遍历”的顺序:
右边的空余地方,统一指向按照中序遍历接下来要去往的那个节点;
左边的空域地方,也可以统一指向来之前的节点
这样可以做到来去自如
问题还没有完全解决,我们看到,其实只有叶子节点是有 ^ 的,那么也就是说,一个节点的左右两边有可能是用来“指路”的,有的是正儿八经用来指向儿子的。所以怎么判断呢?结构体内得加两个变量,以作标记。比如这个变量是1的时候就是指向儿子、0的时候就指路。
而代码实现的部分,就非常的灵性:
你会发现,和之前的中序遍历非常相似—没错,本质上(我认为)就是在遍历的过程中顺便加上了这些 前驱/后继
#include <bits/stdc++.h> //双亲表示法 typedef enum { Link; Thread; }PinterTag; typedef struct BiThrNode{ int data; struct BiThrNode *lchild,*rchild; PointerTag Ltag; PointerTag Rtag; }BiThrNode,*BiThrTree; BiThrTreee pre; void InThreading(BiThrTree p) { if(p) { InThreading(p->lchild)//递归左子树线索化 if(!p ->lchild) { p->Ltag=Thread;//前驱线索 p->lchild=pre;//左孩子指针指向前驱 } if(!pre->rchild) { p->Rtag=Thread;//后驱线索 p->rchild=p;//前驱右孩子指针指向后驱 即当前节点p } pre=p;//保持pre指向p的前驱 InThreading(p->rchild); } }
不难发现,就是在遍历的代码中间加入了一系列操作
可以想象成边遍历边穿针引线。
一棵普普通通的树肯定难搞,每个节点各有各自的儿子数,想要存储并且利用简直不可能。所以有必要转换为二叉树。
所以转化的规则如下:
其中一个细节需要注意:
代码如下(示例):
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarnings('ignore') import ssl ssl._create_default_https_context = ssl._create_unverified_context
代码如下(示例):
data = pd.read_csv( 'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv') print(data.head())
该处使用的url网络请求的数据。
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。