1.二叉树的数据结构设计和用法说明
#ifndef BinaryTree_H #define BinaryTree_H #include #include class BinaryTree { private: typedef int Item; typedef struct TreeNode { Item Node; TreeNode* pRight; TreeNode* pLeft; TreeNode(Item node = 0, TreeNode* pright = NULL, TreeNode* pleft = NULL) : Node(node) , pRight(pright) , pLeft(pleft) { } }TreeNode, *PTreeNode; public: enum TraverseType { PREORDER = 0, // 前序 INORDER = 1, // 中序 POSTORDER = 2, // 后序 LEVELORDER = 3 // 层序 }; BinaryTree(Item Array[], int nLength); ~BinaryTree(); PTreeNode GetRoot() { return m_pRoot; } // 遍历树的对外接口 // 指定遍历类型和是否是非递归遍历,默认是递归遍历 void Traverse(TraverseType traversetype, bool bRec = true); private: PTreeNode CreateTreeImpl(Item Array[], int nLength); void DetroyTreeImpl(PTreeNode pTreenode); void PreTraverseImpl(PTreeNode pTreenode); // 递归前序遍历树 void InTraverseImpl(PTreeNode pTreenode); // 递归中序遍历树 void PostTraverseImpl(PTreeNode pTreenode); // 递归后序遍历树 void NoRecPreTraverseImpl(PTreeNode pTreenode); // 非递归前序遍历树 void NoRecInTraverseImpl(PTreeNode pTreenode); // 非递归中序遍历树 void NoRecPostTraverseImpl(PTreeNode pTreenode); // 非递归后序遍历树 void LevelTraverseImpl(PTreeNode pTreenode); PTreeNode m_pRoot; // 根结点 // 采用STL里面的stack作为模拟保存链表结点的stack容器 typedef std::stack TreeNodeStack; }; #endif #include #include #include #include "BinaryTree.h" BinaryTree::BinaryTree(Item Array[], int nLength) : m_pRoot(NULL) { assert(NULL != Array); assert(nLength > 0); m_pRoot = CreateTreeImpl(Array, nLength); } BinaryTree::~BinaryTree() { DetroyTreeImpl(m_pRoot); } // 按照中序递归创建树 BinaryTree::PTreeNode BinaryTree::CreateTreeImpl(Item Array[], int nLength) { int mid = nLength / 2; PTreeNode p = new TreeNode(Array[mid]); if (nLength > 1) { p->pLeft = CreateTreeImpl(Array, nLength / 2); p->pRight = CreateTreeImpl(Array + mid + 1, nLength / 2 - 1); } return p; } void BinaryTree::DetroyTreeImpl(PTreeNode pTreenode) { if (NULL != pTreenode->pLeft) { DetroyTreeImpl(pTreenode->pLeft); } if (NULL != pTreenode->pRight) { DetroyTreeImpl(pTreenode->pRight); } delete pTreenode; pTreenode = NULL; } // 遍历树的对外接口 // 指定遍历类型和是否是非递归遍历,默认是递归遍历 void BinaryTree::Traverse(TraverseType traversetype, bool bRec /**//*= true*/) { switch (traversetype) { case PREORDER: // 前序 { if (true == bRec) { std::cout << "递归前序遍历树\n"; PreTraverseImpl(m_pRoot); } else { std::cout << "非递归前序遍历树\n"; NoRecPreTraverseImpl(m_pRoot); } } break; case INORDER: // 中序 { if (true == bRec) { std::cout << "递归中序遍历树\n"; InTraverseImpl(m_pRoot); } else { std::cout << "非递归中序遍历树\n"; NoRecInTraverseImpl(m_pRoot); } } break; case POSTORDER: // 后序 { if (true == bRec) { std::cout << "递归后序遍历树\n"; PostTraverseImpl(m_pRoot); } else { std::cout << "非递归后序遍历树\n"; NoRecPostTraverseImpl(m_pRoot); } } break; case LEVELORDER: // 层序 { std::cout << "层序遍历树\n"; LevelTraverseImpl(m_pRoot); } } std::cout << std::endl; } // 递归前序遍历树 void BinaryTree::PreTraverseImpl(PTreeNode pTreenode) { if (NULL == pTreenode) return; std::cout << "Item = " << pTreenode->Node << std::endl; PreTraverseImpl(pTreenode->pLeft); PreTraverseImpl(pTreenode->pRight); } // 非递归前序遍历树 void BinaryTree::NoRecPreTraverseImpl(PTreeNode pTreenode) { if (NULL == pTreenode) return; TreeNodeStack NodeStack; PTreeNode pNode; NodeStack.push(pTreenode); while (!NodeStack.empty()) { while (NULL != (pNode = NodeStack.top())) // 向左走到尽头 { std::cout << "Item = " << pNode->Node << std::endl; // 访问当前结点 NodeStack.push(pNode->pLeft); // 左子树根结点入栈 } NodeStack.pop(); // 左子树根结点退栈 if (!NodeStack.empty()) { pNode = NodeStack.top(); NodeStack.pop(); // 当前结点退栈 NodeStack.push(pNode->pRight); // 当前结点的右子树根结点入栈 } } } // 中序遍历树 // 中序遍历输出的结果应该和用来初始化树的数组的排列顺序一致 void BinaryTree::InTraverseImpl(PTreeNode pTreenode) { if (NULL == pTreenode) return; if (NULL != pTreenode->pLeft) { InTraverseImpl(pTreenode->pLeft); } std::cout << "Item = " << pTreenode->Node << std::endl; if (NULL != pTreenode->pRight) { InTraverseImpl(pTreenode->pRight); } } // 非递归中序遍历树 void BinaryTree::NoRecInTraverseImpl(PTreeNode pTreenode) { if (NULL == pTreenode) return; TreeNodeStack NodeStack; PTreeN。
2.如何将二叉树从二期模型向n期模型进行拓展?由此导出布莱克—斯科
可参考:
期权、期货及其他衍生产品(原书第8版)
* 作者: (加)约翰C.赫尔(John C.Hull)
* 译者: *** 索吾林
* 丛书名: 华章教材经典译丛
* 出版社:机械工业出版社
* ISBN:9787111358213
* 出版日期:2012 年1月
第12章二叉树180
12.1单步二叉树模型与无套利方法180
12.2风险中性定价183
12.3两步二叉树184
12.4看跌期权实例186
12.5美式期权186
12.6Delta187
12.7选取u和d使二叉树与波动率吻合188
12.8二叉树公式189
12.9增加二叉树的时间步数190
12.10使用DerivaGem软件190
12.11对于其他标的资产的期权190
小结193
推荐阅读193
练习题194
作业题194
附录12A 由二叉树模型推导布莱克斯科尔斯默顿期权定价公式195
3.二叉树的数据结构设计和用法说明
#ifndef BinaryTree_H #define BinaryTree_H #include #include class BinaryTree { private: typedef int Item; typedef struct TreeNode { Item Node; TreeNode* pRight; TreeNode* pLeft; TreeNode(Item node = 0, TreeNode* pright = NULL, TreeNode* pleft = NULL) : Node(node) , pRight(pright) , pLeft(pleft) { } }TreeNode, *PTreeNode; public: enum TraverseType { PREORDER = 0, // 前序 INORDER = 1, // 中序 POSTORDER = 2, // 后序 LEVELORDER = 3 // 层序 }; BinaryTree(Item Array[], int nLength); ~BinaryTree(); PTreeNode GetRoot() { return m_pRoot; } // 遍历树的对外接口 // 指定遍历类型和是否是非递归遍历,默认是递归遍历 void Traverse(TraverseType traversetype, bool bRec = true); private: PTreeNode CreateTreeImpl(Item Array[], int nLength); void DetroyTreeImpl(PTreeNode pTreenode); void PreTraverseImpl(PTreeNode pTreenode); // 递归前序遍历树 void InTraverseImpl(PTreeNode pTreenode); // 递归中序遍历树 void PostTraverseImpl(PTreeNode pTreenode); // 递归后序遍历树 void NoRecPreTraverseImpl(PTreeNode pTreenode); // 非递归前序遍历树 void NoRecInTraverseImpl(PTreeNode pTreenode); // 非递归中序遍历树 void NoRecPostTraverseImpl(PTreeNode pTreenode); // 非递归后序遍历树 void LevelTraverseImpl(PTreeNode pTreenode); PTreeNode m_pRoot; // 根结点 // 采用STL里面的stack作为模拟保存链表结点的stack容器 typedef std::stack TreeNodeStack; }; #endif #include #include #include #include "BinaryTree.h" BinaryTree::BinaryTree(Item Array[], int nLength) : m_pRoot(NULL) { assert(NULL != Array); assert(nLength > 0); m_pRoot = CreateTreeImpl(Array, nLength); } BinaryTree::~BinaryTree() { DetroyTreeImpl(m_pRoot); } // 按照中序递归创建树 BinaryTree::PTreeNode BinaryTree::CreateTreeImpl(Item Array[], int nLength) { int mid = nLength / 2; PTreeNode p = new TreeNode(Array[mid]); if (nLength > 1) { p->pLeft = CreateTreeImpl(Array, nLength / 2); p->pRight = CreateTreeImpl(Array + mid + 1, nLength / 2 - 1); } return p; } void BinaryTree::DetroyTreeImpl(PTreeNode pTreenode) { if (NULL != pTreenode->pLeft) { DetroyTreeImpl(pTreenode->pLeft); } if (NULL != pTreenode->pRight) { DetroyTreeImpl(pTreenode->pRight); } delete pTreenode; pTreenode = NULL; } // 遍历树的对外接口 // 指定遍历类型和是否是非递归遍历,默认是递归遍历 void BinaryTree::Traverse(TraverseType traversetype, bool bRec /**//*= true*/) { switch (traversetype) { case PREORDER: // 前序 { if (true == bRec) { std::cout << "递归前序遍历树\n"; PreTraverseImpl(m_pRoot); } else { std::cout << "非递归前序遍历树\n"; NoRecPreTraverseImpl(m_pRoot); } } break; case INORDER: // 中序 { if (true == bRec) { std::cout << "递归中序遍历树\n"; InTraverseImpl(m_pRoot); } else { std::cout << "非递归中序遍历树\n"; NoRecInTraverseImpl(m_pRoot); } } break; case POSTORDER: // 后序 { if (true == bRec) { std::cout << "递归后序遍历树\n"; PostTraverseImpl(m_pRoot); } else { std::cout << "非递归后序遍历树\n"; NoRecPostTraverseImpl(m_pRoot); } } break; case LEVELORDER: // 层序 { std::cout << "层序遍历树\n"; LevelTraverseImpl(m_pRoot); } } std::cout << std::endl; } // 递归前序遍历树 void BinaryTree::PreTraverseImpl(PTreeNode pTreenode) { if (NULL == pTreenode) return; std::cout << "Item = " << pTreenode->Node << std::endl; PreTraverseImpl(pTreenode->pLeft); PreTraverseImpl(pTreenode->pRight); } // 非递归前序遍历树 void BinaryTree::NoRecPreTraverseImpl(PTreeNode pTreenode) { if (NULL == pTreenode) return; TreeNodeStack NodeStack; PTreeNode pNode; NodeStack.push(pTreenode); while (!NodeStack.empty()) { while (NULL != (pNode = NodeStack.top())) // 向左走到尽头 { std::cout << "Item = " << pNode->Node << std::endl; // 访问当前结点 NodeStack.push(pNode->pLeft); // 左子树根结点入栈 } NodeStack.pop(); // 左子树根结点退栈 if (!NodeStack.empty()) { pNode = NodeStack.top(); NodeStack.pop(); // 当前结点退栈 NodeStack.push(pNode->pRight); // 当前结点的右子树根结点入栈 } } } // 中序遍历树 // 中序遍历输出的结果应该和用来初始化树的数组的排列顺序一致 void BinaryTree::InTraverseImpl(PTreeNode pTreenode) { if (NULL == pTreenode) return; if (NULL != pTreenode->pLeft) { InTraverseImpl(pTreenode->pLeft); } std::cout << "Item = " << pTreenode->Node << std::endl; if (NULL != pTreenode->pRight) { InTraverseImpl(pTreenode->pRight); } } // 非递归中序遍历树 void BinaryTree::NoRecInTraverseImpl(PTreeNode pTreenode) { if (NULL == pTreenode) return; TreeNodeStack NodeStack; 。