2016/11/30

来源:互联网 发布:数据库安全管理办法 编辑:程序博客网 时间:2024/06/08 16:16
1631-5 黄加勉 <2016.11.30> 【连续第60天总结】


A.今日任务
1.二叉树的链表形式表达(65%)
2.二叉树的前中后序遍历(100%)
3.快速排序


B.具体内容
1.链表形式的二叉树好处在于可以任意的往父节点上添加子节点,不需要受到初始化数组事内存空间的限制
 无论什么样的链表,基本的结构都是节点Node,因此需要定义一个Node的类
class Node
{
public:
Node();
Node* getNode(int index);//寻找二叉树中的某一节点
void preorderTraversal();//前序遍历
void inorderTraversal();//中序遍历
void postorderTraversal();//后序遍历
int m_iIndex; //索引
int m_iData; //数据
Node *m_pParent;//双亲节点/父节点指针
Node *m_pLchild;//左孩子树指针
Node *m_pRchild;//右孩子树指针
};
 当初始化一颗树时,初始化根节点m_pRoot,添加节点就是把新的节点的父节点指针指向根节点,根节点的左或右孩子树指针指向新加入的节点:
void BinaryTree::addNode(int index, char direction, Node *parNode)
{
//判断二叉树中是否存在当前索引的节点
Node *tempNode = getNode(index);
if (tempNode == NULL)
return;
//建立新节点
Node *newNode = new Node();
newNode->m_iData = parNode->m_iData;
newNode->m_iIndex = parNode->m_iIndex;
if (direction == 'L')
{
tempNode->m_pLchild = newNode;
cout << "success!" << endl;
}
else if (direction == 'R')
{
tempNode->m_pRchild = newNode;
cout << "success!" << endl;
}
}
 二叉树的遍历分为前序遍历、中序遍历和后序遍历,遍历顺序分别为“根左右”、”左根右“、”左右根”
 因为遍历整颗树,所以可以把每个节点当做根节点用node类中的遍历函数递归遍历:
  //前序遍历
void Node::preorderTraversal()
{
cout << "No." << m_iIndex << "  " << m_iData << endl;
if (m_pLchild != NULL)
m_pLchild->preorderTraversal();
if (m_pRchild != NULL)
m_pRchild->preorderTraversal();
}
//中序遍历
void Node::inorderTraversal()
{
if (m_pLchild != NULL)
m_pLchild->inorderTraversal();
cout << "No." << m_iIndex << "  " << m_iData << endl;
if (m_pRchild != NULL)
m_pRchild->inorderTraversal();
}
//后续遍历
void Node::postorderTraversal()
{
if (m_pLchild != NULL)
m_pLchild->postorderTraversal();
if (m_pRchild != NULL)
m_pRchild->postorderTraversal();
cout << "No." << m_iIndex << "  " << m_iData << endl;
}
2.如果用当前的函数添加新节点,因为m_pRoot索引始终为零,所以最多插入三层的节点,所以我觉得插入更多节点时应该先遍历整棵树,找到节点后在插入元素,明天实现
3.快速排序(升序)的原理简单说就是安基数把数组划分为三个区间,左边小于基数,右边大于基数,再递归上述过程至子区间中有且仅有一个元素为止
 因此需要一个函数获取区间划分后基数指针的函数getAdjustNumber()(想不到更好的名字了)
int getAdjustNumber(int arr[], int head, int tail)
{
int temp = arr[head];
int i = head, j = tail;
while (i != j)
{
//从尾搜索小于基数的元素
while (arr[j] > temp && j > i)
j--;
if (i < j)
{
arr[i] = arr[j];
//从头搜索大于基数的元素
while (arr[i] < temp && j > i)
i++;
if (i < j)
{
arr[j] = arr[i];
j--;
}
}
}
arr[i] = temp;
//返回基数指针
return i;
}
于是当排序是可以用她简化代码:
void quickSort(int arr[], int head, int tail)
{
int temp;
if (tail > head)
{
temp = getAdjustNumber(arr, head, tail);
quickSort(arr, head, temp - 1);
quickSort(arr, temp + 1, tail);
}
}
 4.感觉要起好函数名还是要学好英语,不然会起出一些不知所云的函数名和变量名。。


C.明日任务
1.链表二叉树
2.堆排序
blog.csdn.net/voooooh_8
0 0
原创粉丝点击