二叉树的学习(四种遍历方法,搜索,插入,删除等)
2017-08-04 14:48
423 查看
对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;
证明过程如下:
假设二叉树的0度,1度,2度结点为n0,n1,n2,总节点数为T(显然,叶节点数就是n0)
则有按照结点求和的
T = n0 + n1 + n2 (1)
按照边求和得:
T = n1 + 2 * n2 + 1 (2)
所以 (2) - (1)可得
n2 + 1 - n0 = 0
所以n0 = n2 + 1。
环境:VS015
证明过程如下:
假设二叉树的0度,1度,2度结点为n0,n1,n2,总节点数为T(显然,叶节点数就是n0)
则有按照结点求和的
T = n0 + n1 + n2 (1)
按照边求和得:
T = n1 + 2 * n2 + 1 (2)
所以 (2) - (1)可得
n2 + 1 - n0 = 0
所以n0 = n2 + 1。
环境:VS015
#include "stdafx.h" #include <iostream> #include <stack> #include <queue> using namespace std; /*************************************** 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1; 证明过程如下: 假设二叉树的0度,1度,2度结点为n0,n1,n2,总节点数为T(显然,叶节点数就是n0) 则有按照结点求和的 T = n0 + n1 + n2 (1) 按照边求和得: T = n1 + 2 * n2 + 1 (2) 所以 (2) - (1)可得 n2 + 1 - n0 = 0 所以n0 = n2 + 1 ***************************************/ //根每一棵子树是根的儿子(child),根叫做子树的父亲(parent),没有儿子的节点叫做树叶(leaf), //具有相同的父亲的节点叫做兄弟(sibling) /****************************** The defination of tree 树的定义 结构体 ******************************/ typedef struct TreeNode BinTree; struct TreeNode { int ex; //the address of the first child. TreeNode *Left; //the address of the next sibling TreeNode *Right; }; /****************************** 功能:(递归)前序遍历二叉树(先根,再右左边,再右边) 输入:二叉树根节点 输出:输出节点数据 ******************************/ void preOrderTraversal(TreeNode *BootNode) { if (BootNode) { cout << BootNode->ex; preOrderTraversal(BootNode->Left); preOrderTraversal(BootNode->Right); } } /****************************** 功能:(递归)中序遍历二叉树(先左边,再根,再右边) 输入:二叉树根节点 输出:输出节点数据 ******************************/ void inOrderTraversal(TreeNode *BootNode) { if (BootNode) { inOrderTraversal(BootNode->Left); cout << BootNode->ex; inOrderTraversal(BootNode->Right); } } /****************************** 功能:(递归)后序遍历二叉树(先左边,再右边,再根) 输入:二叉树根节点 输出:输出节点数据 ******************************/ void postOrderTraversal(TreeNode *BootNode) { if (BootNode) { postOrderTraversal(BootNode->Left); cout << BootNode->ex; postOrderTraversal(BootNode->Right); } } /****************************** 功能:堆栈实现中序遍历 输入:二叉树根节点 输出:输出节点数据 ******************************/ void inOrderTraversal_stack(TreeNode *BootNode) { TreeNode *Tree;//创建新根 Tree = BootNode; Tree = new TreeNode; stack<TreeNode> S;//创建堆栈 while (Tree || !S.empty()) { while(Tree) { S.push(*Tree);//入栈 inOrderTraversal_stack(Tree->Left);//左边走到尽头 } if (!S.empty()) { *Tree = S.top();//取栈顶元素 S.pop();//出栈 cout << Tree->ex;//输出 Tree = Tree->Right;//找这个节点(左边节点已经找完了的)的右边节点的子节点 } } } /****************************** 功能:层序遍历(一层一层的输出) 输入:二叉树根节点 输出:输出节点数据 ******************************/ void levelOrderTraversal(TreeNode *BootNode) { if (!BootNode) return; queue<TreeNode> Q; TreeNode* Tree = NULL; Q.push(*BootNode); while (!Q.empty()) { *Tree = Q.front(); cout << Tree->ex<<endl; Q.pop(); if(Tree->Left) Q.push(*(Tree->Left)); if (Tree->Right) Q.push(*(Tree->Right)); } } /****************************** 功能:二叉搜索树(尾递归) 输入:搜索值,二叉树根节点 输出:返回节点 ******************************/ TreeNode* findPosition1(int x,TreeNode *BootNode) { if (!BootNode) return NULL; if (x > BootNode->ex) return findPosition1(x, BootNode->Right); else if (x < BootNode->ex) return findPosition1(x, BootNode->Left); else return BootNode; } /****************************** 功能:二叉搜索树(迭代函数) 输入:搜索值,二叉树根节点 输出:返回节点 ******************************/ TreeNode* findPosition2(int x, TreeNode *BootNode) { while (BootNode) { if (x > BootNode->ex) BootNode = BootNode->Right; else if (x < BootNode->ex) BootNode = BootNode->Left; else return BootNode; } return NULL; } /****************************** 功能:查找二叉树最小元素(递归) 输入:搜索值,二叉树根节点 输出:返回节点 ******************************/ TreeNode* findMin(TreeNode *BootNode) { if (!BootNode) return NULL; if (!BootNode->Left) return BootNode; else return findMin(BootNode->Left); } /****************************** 功能:查找二叉树最大元素(递归) 输入:搜索值,二叉树根节点 输出:返回节点 ******************************/ TreeNode* findMax(TreeNode *BootNode) { if (!BootNode) return NULL; if (!BootNode->Right) return BootNode; else return findMax(BootNode->Right); } /****************************** 功能:二叉搜索树的插入(递归) 输入:搜索值,二叉树根节点 输出:返回节点 ******************************/ TreeNode* insert(int x,TreeNode *BootNode) { if (!BootNode) { BootNode = new TreeNode; BootNode->ex = x; BootNode->Left = BootNode->Right = NULL; } else { if (BootNode->ex < x) { BootNode->Right=insert(x, BootNode->Right); } else BootNode->Left=insert(x, BootNode->Left); } return BootNode; } /****************************** 功能:二叉搜索树的s删除(递归) 输入:要删除的值,二叉树根节点 输出:返回节点 ******************************/ TreeNode* deleteN(int x, TreeNode *BootNode) { TreeNode *temp; temp = new TreeNode; if (!BootNode) cout << "NULL Value"; else if (x < BootNode->ex) BootNode->Left = deleteN(x, BootNode->Left); else { if (BootNode->Left && BootNode->Right) { temp = findPosition1(x, BootNode->Right); BootNode->ex = temp->ex; BootNode->ex = temp->ex; BootNode->Right = deleteN(BootNode->ex, BootNode->Right); } else { temp = BootNode; if (!BootNode->Left) BootNode = BootNode->Right; else if(BootNode->Right) BootNode = BootNode->Left; delete(temp); } } return BootNode; }
相关文章推荐
- 数据结构与算法分析学习笔记--第四章(搜索二叉树,递归和非递归实现删除、插入)
- 算法学习----二叉树的查找、 删除、插入、遍历
- 搜索二叉树(插入,删除,遍历)
- 二叉树的各种操作:前序、中序、后序、层序遍历,二叉树搜索、插入和删除等操作
- C++ 二叉树(创建,遍历,查找,插入,删除)『菜鸟版』
- 剑指offer 二叉树(搜索二叉树插入,遍历)未完待续。。
- 二叉树的先序中序后序递归非递归遍历,插入删除等操作
- 数据结构二叉树的java实现,包括二叉树的创建、搜索、删除和遍历
- java递归方法建立搜索二叉树,具备查找关键字,插入新节点功能
- 二叉树三种遍历及删除和插入
- 二叉排序树(插入、删除、更新、遍历、搜索、求树高。。。)
- 二叉树操作(插入、删除、遍历(递归与非递归))
- 数据结构:题目(4)遍历二叉树的四种方法: 依次是:层次、前序、中序、后序
- SQL Server XML基础学习之<7>--XML modify() 方法对 XML 数据中插入、更新或删除
- 二叉树的先序中序后序递归非递归遍历,插入删除等操作
- 二叉树 BinaryTree (先序、中序、后序遍历 节点查找、插入、删除 完整类) Java数据结构与算法
- 二叉树(插入,删除,遍历等)java实现
- SQL Server XML基础学习之<6>--XML modify() 方法对 XML 数据中插入、更新或删除
- C++算法之 求二叉树的节点个数、深度、四种遍历方法
- 用递归的方法进行二叉树的搜索和插入